davinci_pas_test_kit 0.12.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/pas_server_subscription_creation_against_pas_client.json +32 -0
  3. data/lib/davinci_pas_test_kit/certs/InfernoCA.key +52 -0
  4. data/lib/davinci_pas_test_kit/certs/InfernoCA.pem +35 -0
  5. data/lib/davinci_pas_test_kit/certs/TestKit.pem +32 -0
  6. data/lib/davinci_pas_test_kit/certs/TestKitPrivateKey.key +28 -0
  7. data/lib/davinci_pas_test_kit/client_suite.rb +141 -100
  8. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_registration/configuration_other_display_test.rb +46 -0
  9. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_registration/configuration_smart_display_test.rb +37 -0
  10. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_registration/configuration_udap_display_test.rb +37 -0
  11. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_registration/other_auth_attest_test.rb +36 -0
  12. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_approval_submit_test.rb +24 -10
  13. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_denial_submit_test.rb +23 -10
  14. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_inquire_must_support_test.rb +21 -9
  15. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_inquire_request_bundle_validation_test.rb +4 -0
  16. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_pended_submit_test.rb +30 -14
  17. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_request_bundle_validation_test.rb +6 -0
  18. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_response_attest.rb +4 -9
  19. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_submit_must_support_test.rb +24 -9
  20. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_subscription_create_test.rb +26 -13
  21. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_subscription_pas_conformance_test.rb +6 -24
  22. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/error_tests/pas_inquiry_error_test.rb +1 -0
  23. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/error_tests/pas_submission_error_test.rb +3 -0
  24. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/notification/pas_subscription_notification_test.rb +24 -20
  25. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_approval_group.rb +6 -4
  26. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_auth_smart_group.rb +32 -0
  27. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_auth_udap_group.rb +31 -0
  28. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_denial_group.rb +10 -4
  29. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_must_support_group.rb +29 -0
  30. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_options.rb +25 -0
  31. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_pended_group.rb +11 -4
  32. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_registration_group.rb +63 -0
  33. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_subscription_setup_group.rb +23 -0
  34. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_workflows_group.rb +21 -0
  35. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_server_subscription_input_conformance.rb +35 -0
  36. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_server_subscription_setup.rb +43 -0
  37. data/lib/davinci_pas_test_kit/descriptions.rb +10 -0
  38. data/lib/davinci_pas_test_kit/docs/client_suite_description_v201.md +203 -79
  39. data/lib/davinci_pas_test_kit/docs/demo/PAS Client Suite Demonstration.postman_collection.json +246 -0
  40. data/lib/davinci_pas_test_kit/docs/server_suite_description_v201.md +21 -10
  41. data/lib/davinci_pas_test_kit/endpoints/claim_endpoint.rb +13 -1
  42. data/lib/davinci_pas_test_kit/endpoints/subscription_create_endpoint.rb +13 -1
  43. data/lib/davinci_pas_test_kit/endpoints/subscription_status_endpoint.rb +10 -1
  44. data/lib/davinci_pas_test_kit/endpoints/token_endpoint.rb +29 -15
  45. data/lib/davinci_pas_test_kit/generated/v2.0.1/beneficiary/metadata.yml +2 -1
  46. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim/claim_operation_test.rb +1 -1
  47. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim/metadata.yml +28 -17
  48. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim_inquiry/claim_inquiry_operation_test.rb +1 -2
  49. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim_inquiry/client_inquire_request_claim_inquiry_must_support_test.rb +4 -1
  50. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim_inquiry/metadata.yml +7 -1
  51. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim_inquiry/server_inquire_request_claim_inquiry_must_support_test.rb +3 -1
  52. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim_update/client_submit_request_claim_update_must_support_test.rb +9 -3
  53. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim_update/metadata.yml +28 -17
  54. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim_update/server_submit_request_claim_update_must_support_test.rb +9 -3
  55. data/lib/davinci_pas_test_kit/generated/v2.0.1/claiminquiryresponse/metadata.yml +6 -0
  56. data/lib/davinci_pas_test_kit/generated/v2.0.1/claiminquiryresponse/server_inquire_response_claiminquiryresponse_must_support_test.rb +1 -0
  57. data/lib/davinci_pas_test_kit/generated/v2.0.1/claimresponse/metadata.yml +8 -0
  58. data/lib/davinci_pas_test_kit/generated/v2.0.1/claimresponse/server_submit_response_claimresponse_must_support_test.rb +1 -0
  59. data/lib/davinci_pas_test_kit/generated/v2.0.1/communication_request/metadata.yml +4 -0
  60. data/lib/davinci_pas_test_kit/generated/v2.0.1/coverage/metadata.yml +11 -5
  61. data/lib/davinci_pas_test_kit/generated/v2.0.1/device_request/metadata.yml +2 -0
  62. data/lib/davinci_pas_test_kit/generated/v2.0.1/encounter/metadata.yml +6 -0
  63. data/lib/davinci_pas_test_kit/generated/v2.0.1/insurer/metadata.yml +4 -2
  64. data/lib/davinci_pas_test_kit/generated/v2.0.1/medication_request/metadata.yml +2 -0
  65. data/lib/davinci_pas_test_kit/generated/v2.0.1/metadata.yml +153 -53
  66. data/lib/davinci_pas_test_kit/generated/v2.0.1/nutrition_order/metadata.yml +2 -0
  67. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_inquiry_request_bundle/metadata.yml +2 -1
  68. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_inquiry_request_bundle/server_pas_inquiry_request_bundle_validation_test.rb +0 -2
  69. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_inquiry_response_bundle/metadata.yml +2 -1
  70. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_inquiry_response_bundle/server_pas_inquiry_response_bundle_validation_test.rb +2 -3
  71. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_request_bundle/metadata.yml +2 -1
  72. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_request_bundle/server_pas_request_bundle_validation_test.rb +0 -2
  73. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_response_bundle/metadata.yml +2 -1
  74. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_response_bundle/server_pas_response_bundle_validation_test.rb +2 -3
  75. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_server_approval_use_case_group.rb +0 -1
  76. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_server_denial_use_case_group.rb +0 -1
  77. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_server_must_support_use_case_group.rb +3 -0
  78. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_server_pended_use_case_group.rb +10 -3
  79. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner/metadata.yml +2 -1
  80. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner_role/metadata.yml +4 -0
  81. data/lib/davinci_pas_test_kit/generated/v2.0.1/requestor/metadata.yml +4 -2
  82. data/lib/davinci_pas_test_kit/generated/v2.0.1/server_suite.rb +8 -5
  83. data/lib/davinci_pas_test_kit/generated/v2.0.1/service_request/metadata.yml +2 -0
  84. data/lib/davinci_pas_test_kit/generated/v2.0.1/task/metadata.yml +4 -0
  85. data/lib/davinci_pas_test_kit/generator/group_generator.rb +20 -4
  86. data/lib/davinci_pas_test_kit/generator/group_metadata_extractor.rb +2 -2
  87. data/lib/davinci_pas_test_kit/generator/ig_resources.rb +4 -0
  88. data/lib/davinci_pas_test_kit/generator/must_support_test_generator.rb +14 -3
  89. data/lib/davinci_pas_test_kit/generator/operation_test_generator.rb +16 -3
  90. data/lib/davinci_pas_test_kit/generator/templates/group.rb.erb +10 -3
  91. data/lib/davinci_pas_test_kit/generator/templates/must_support.rb.erb +3 -0
  92. data/lib/davinci_pas_test_kit/generator/templates/operation.rb.erb +4 -1
  93. data/lib/davinci_pas_test_kit/generator/templates/suite.rb.erb +8 -5
  94. data/lib/davinci_pas_test_kit/generator/templates/validation.rb.erb +5 -4
  95. data/lib/davinci_pas_test_kit/generator/validation_test_generator.rb +12 -1
  96. data/lib/davinci_pas_test_kit/must_support_test.rb +2 -202
  97. data/lib/davinci_pas_test_kit/pas_bundle_validation.rb +4 -4
  98. data/lib/davinci_pas_test_kit/pas_subscription_verification.rb +30 -0
  99. data/lib/davinci_pas_test_kit/requirements/davinci-pas-test-kit_out_of_scope_requirements.csv +11 -0
  100. data/lib/davinci_pas_test_kit/requirements/davinci-pas-test-kit_requirements.csv +214 -0
  101. data/lib/davinci_pas_test_kit/requirements/generated/davinci-pas-test-kit_requirements_coverage.csv +214 -0
  102. data/lib/davinci_pas_test_kit/session_identification.rb +45 -0
  103. data/lib/davinci_pas_test_kit/tags.rb +1 -0
  104. data/lib/davinci_pas_test_kit/urls.rb +61 -9
  105. data/lib/davinci_pas_test_kit/version.rb +2 -2
  106. data/lib/davinci_pas_test_kit.rb +1 -0
  107. data/lib/inferno_requirements_tools/ext/inferno_core/runnable.rb +22 -0
  108. data/lib/inferno_requirements_tools/tasks/requirements_coverage.rb +284 -0
  109. data/lib/requirements_config.yaml +17 -0
  110. metadata +62 -10
  111. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_token_request_test.rb +0 -31
  112. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_token_validation_test.rb +0 -18
  113. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_authentication_group.rb +0 -49
  114. data/lib/davinci_pas_test_kit/generator/must_support_metadata_extractor.rb +0 -327
@@ -26,6 +26,13 @@ Inferno will seek to observe conformant handling of PAS requirements, including
26
26
  - The ability to handle responses that contain all PAS profiles and all must support elements on those
27
27
  profiles (not included in the current version of these tests)
28
28
 
29
+ All requests and responses will be checked for conformance to the PAS
30
+ IG requirements individually and used in aggregate to determine whether
31
+ required features and functionality are present. HL7® FHIR® resources are
32
+ validated with the Java validator using `tx.fhir.org` as the terminology server.
33
+
34
+ ### Responses
35
+
29
36
  Inferno contains basic logic to generate approval, denial, and pended responses, along with a
30
37
  notification that a final decision was made, as a part of the above workflows.
31
38
  These responses are based on examples available in the PAS Implementation Guide
@@ -34,80 +41,103 @@ testers may provide Inferno with specific responses for Inferno to echo. If resp
34
41
  are provided, Inferno will check them for conformance to ensure that they demonstrate
35
42
  a fully conformant exchange.
36
43
 
37
- All requests and responses will be checked for conformance to the PAS
38
- IG requirements individually and used in aggregate to determine whether
39
- required features and functionality are present. HL7® FHIR® resources are
40
- validated with the Java validator using `tx.fhir.org` as the terminology server.
44
+ ### Authentication
45
+
46
+ The [Privacy and Security section](https://hl7.org/fhir/us/davinci-pas/STU2/privacy.html) of the PAS
47
+ Implementation Guide states that payers must "require that the provider system authenticates"
48
+ itself when making PAS requests against the payer system. However, the specific method of authentication
49
+ is left to the Da Vinci HRex IG, which [provides recommendations and potential
50
+ approaches](https://hl7.org/fhir/us/davinci-hrex/STU1/security.html#exchange-security) for
51
+ authentication, but does not require a specific one to be used. Inferno requires some
52
+ authentication approach to be used in order for it to be able to identify which incoming
53
+ requests are from the client under test.
54
+
55
+ Inferno's simulated payer server includes a simulation of two standard authentication approaches:
56
+ - SMART Backend Services
57
+ - UDAP B2B client credentials flow, including dynamic registration
58
+
59
+ Clients under test can register with the authorization server and request tokens for use
60
+ when making PAS requests. In this case, Inferno will verify that the client's interactions with
61
+ the simulated authorization server are conformant and that the provided tokens are used.
62
+
63
+ If the client under test does not support either of these standards-based methods of authentication, the tester
64
+ may instead attest to other authentication capabilities. In this case, the client will authenticate
65
+ by sending requests to dedicated PAS endpoints created by Inferno for use during the testing session.
66
+ To reduce configuration burden, the dedicated endpoints can be reused in subsequent sessions.
41
67
 
42
68
  ## Running the Tests
43
69
 
44
70
  ### Quick Start
45
71
 
46
- For Inferno to simulate a server that returns mocked conformant responses, it needs
47
- only to know the bearer token that the client will send on requests, for which there are two options.
48
-
49
- 1. If you want to choose your own bearer token, then:
50
- 1. Select the **2.** PAS Client Validation test from the list on the left.
51
- 2. Click the '*Run All Tests*' button on the right.
52
- 3. In the "Access Token" input field, enter the bearer token that will be sent by the client under test
53
- in the Authorization HTTP header (format: `Bearer <provided value>`) for all requests to Inferno.
54
- 4. Click the '*Submit*' button at the bottom of the dialog.
55
- 2. If you want to use a Client ID to obtain an access token, then:
56
- 1. Click the '*Run All Tests*' button on the right.
57
- 2. Provide the client's registered id "Client ID" input field (NOTE: Inferno doesn't support the
58
- registration API, so this must be obtained from another system or configured manually).
59
- 3. Click the '*Submit*' button at the bottom of the dialog.
60
- 4. Make a token request that includes the specified Client ID to the
61
- `<inferno host>/custom/davinci_pas_client_suite_v201/mock_auth/token` endpoint to get
62
- an access token from Inferno which the client will need to provide in the
63
- Authorization HTTP header (format: `Bearer <provided value>`) for all subsequent
64
- requests to Inferno for this test session. See the documentation in the
65
- **1.** Demonstration Authorization test for details on the supported access token request.
66
-
67
- In either case, the tests will continue from that point, requesting the tester to
68
- direct the client to make certain requests to demonstrate PAS client capabilities.
69
-
70
- Note: authentication options for these tests have not been finalized and are subject to change.
71
-
72
- ### Postman-based Demo
72
+ To execute a simple set of tests with minimal setup and input, perform an approval workflow using
73
+ inferno-generated responses and dedicated session-specific endpoints with the following steps:
74
+
75
+ 1. Create a Da Vinci PAS Client Suite v2.0.1 session using the "Other Authentication" option
76
+ for the Client Security Type.
77
+ 1. Select the "Client Registration" group from the list at the left and and click
78
+ the "RUN TESTS" button in the upper right.
79
+ 1. Optionally provide a value for the **Session-specific URL path extension** input to
80
+ specify the extra path for the dedicated session endpoint or leave blank to let
81
+ Inferno generate a value for you. Then click the "SUBMIT" button at the bottom right.
82
+ 1. Attest to an alternate authentication approach in the wait dialog that appears and
83
+ then configure your client to connect to the Inferno FHIR server subsequently displayed
84
+ and click the link continue.
85
+ 1. Select the "Approval Workflow" group from the list at the left and click
86
+ the "RUN TESTS" button in the upper right.
87
+ 1. Click the "SUBMIT" button at the bottom right of the input dialog that appears.
88
+ 1. Submit a PAS prior authorization request to the endpoint shown in the wait
89
+ dialog that appears.
90
+ 1. When another wait dialog appears, check your system to see whether Inferno's response
91
+ was interpreted as an approval or not and click the appropriate link in the dialog.
92
+ 1. Review the results including any errors or warnings found when checking the conformance
93
+ of the request or the generated response.
94
+
95
+ Group "Denial Workflow" can be run in the same manner. To run the "Pended Workflow" group,
96
+ first run the "Subscription Setup" group, during which the client system will submit a
97
+ Subscription so that Inferno knows how and where to send a notification that a decision has
98
+ been rendered on a pended prior authorization request. Then proceed to execute the
99
+ "Pended Workflow" group and follow the instructions in the dialogs that appear.
100
+
101
+ ### Postman-based Demonstration
73
102
 
74
103
  If you do not have a PAS client but would like to try the tests out, you can use
75
- [this postman collection](https://github.com/inferno-framework/davinci-pas-test-kit/blob/main/config/PAS%20Test%20Kit%20Client%20Test%20Demo.postman_collection.json)
104
+ [this postman collection](https://github.com/inferno-framework/davinci-pas-test-kit/blob/main/lib/davinci_pas_test_kit/docs/demo/PAS%20Client%20Suite%20Demonstration.postman_collection.json)
76
105
  to make requests against Inferno and see the mocked responses provided by Inferno. To use, load
77
106
  the collection into the [Postman app](https://www.postman.com/downloads/) and follow these steps:
78
107
 
79
- 1. Select the *PAS Client Test Suite Demo* Collection in postman and go to the "Variables" tab
80
- (see the Overview tab for more details on what the variables control).
81
- 1. Note the "Current value" of the **client_id** variable for use in configuring Inferno. Update it
82
- to another value to use instead, if desired.
83
108
  1. Start a Da Vinci PAS Client Suite v2.0.1 session from the [PAS Test Kit page on
84
- inferno.healthit.gov](https://inferno.healthit.gov/test-kits/davinci-pas/).
85
- 1. Click the *Run All Tests* button in the upper right hand corner of the suite.
86
- 1. In the **Client ID** input, enter the value from the **client_id** Postman variable and click the
87
- *Submit* button.
88
- 1. When the "User Action" dialog appears, return to Postman and change to the Authorization tab. Scroll down
89
- to find the *Get New Access Token* button at the bottom and click it.
90
- 1. When a success message appears, click the *Proceed* button and then the *Use Token* button.
91
- 1. Back in Inferno, a new "User Action" dialog will appear requesting a Subscription. When it does, return to Postman,
92
- open the "Create Subscription Request" entry under the "Subscription Setup" folder in the collection,
93
- and click the *Send* button.
94
- 1. Back in Inferno, an **Approval Workflow Test** "User Action" will appear. When it does, return to Postman,
95
- open the "Prior Auth Request For Approval" entry under the "Approval Workflow Requests" folder in the
96
- collection, and click the *Send* button.
97
- 1. Back in Inferno, an attestation "User Action" will appear asking you to confirm that the prior auth
98
- request is listed as approved in the client app based on Inferno's response to the request. Search
99
- in the response returned to Postman for the string "Certified in total" which indicates the prior
100
- auth request was approved and click the link in Inferno indicating the attestation statement is true.
101
- 1. Next, a **Denial Workflow Test** "User Action" will appear. When it does, return to Postman,
102
- open the "Prior Auth Request For Denial" entry under the "Denial Workflow Requests" folder in the
103
- collection, and click the *Send* button.
104
- 1. Back in Inferno, an attestation "User Action" will appear asking you to confirm that the prior auth
105
- request is listed as denied in the client app based on Inferno's response to the request. Search
106
- in the response returned to Postman for the string "Not Certified" which indicates the prior
107
- auth request was denied and click the link in Inferno indicating the attestation statement is true.
108
- 1. Next, a **Pended Workflow Test** "User Action" will appear. When it does, return to Postman,
109
- open the "Prior Auth Request For Pended" entry under the "Pended Workflow Requests" folder in the
110
- collection, and click the *Send* button.
109
+ inferno.healthit.gov](https://inferno.healthit.gov/test-kits/davinci-pas/),
110
+ choosing the "Other Authentication" option for the Client Security Type.
111
+ 2. Click the *Run All Tests* button in the upper right hand corner of the suite.
112
+ 3. Client Registration
113
+ - In the **Session-specific URL path extension** input, put a short alpha string, such as `demo`
114
+ - In Postman, select the *PAS Client Suite Demonstration* Collection in postman and go to the "Variables" tab
115
+ (see the collection's Overview tab for more details on what the variables control).
116
+ - In the current value for the **session_url_path** variable, put the same value as in the
117
+ **Session-specific URL path extension** input, surrounded by `/`, e.g., `/demo/` and
118
+ save the collection.
119
+ - Back in Inferno, click the "SUBMIT" button and click the links to continue the tests
120
+ in the next two wait dialogs until a **Subscription Creation Test** wait dialog appears.
121
+ 1. In Postman, select the *Create Subscription Request* in the *Subscription Setup* folder
122
+ and click the "Send" button in the upper right.
123
+ 1. Back in Inferno, the wait dialog should disappear and a new **Approval Workflow Test** wait
124
+ dialog will appear.
125
+ 1. In Postman, select the *Prior Auth Request For Approval* in the *Approval Workflow* folder
126
+ and click the "Send" button in the upper right.
127
+ 1. Back in Inferno, the wait dialog should disappear and a new attestation wait dialog will
128
+ appear asking to confirm the system's interpretation of the "Approved" response. Check that
129
+ the response from the last step in Postman contains the string "Certified in total" and respond
130
+ to the attestation. The wait dialog should disappear and a new **Denial Workflow Test** wait
131
+ dialog will appear.
132
+ 1. In Postman, select the *Prior Auth Request For Denial* in the *Denial Workflow* folder
133
+ and click the "Send" button in the upper right.
134
+ 1. Back in Inferno, the wait dialog should disappear and a new attestation wait dialog will
135
+ appear asking to confirm the system's interpretation of the "Denied" response. Check that
136
+ the response from the last step in Postman contains the string "Not Certified" and respond
137
+ to the attestation. The wait dialog should disappear and a new **Pended Workflow Test** wait
138
+ dialog will appear.
139
+ 1. In Postman, select the *Prior Auth Request For Pended* entry under the *Pended Workflow* folder in the
140
+ and click the "Send" button in the upper right.
111
141
  1. Search in the response returned to Postman for the string "Pending" which indicates the prior
112
142
  auth request was pended and a final decision will be made later. You'll use this information in
113
143
  a later attestation.
@@ -119,31 +149,125 @@ the collection into the [Postman app](https://www.postman.com/downloads/) and fo
119
149
  hosts a notification endpoint that is used to receive Subscription notifications for this demo.
120
150
  Note that when looking for recent notifications, **Received** timestamps are in UTC which is
121
151
  5 hours ahead of Eastern Standard Time (4 hours ahead of Eastern Daylight Time).
122
- 1. Return to Postman, open the "Prior Auth Inquiry For Pended" entry under the "Pended Workflow Requests"
123
- folder in the collection, and click the *Send* button.
152
+ 1. In Postman, select the *Prior Auth Inquiry for Pended* entry under the *Pended Workflow* folder in the
153
+ and click the "Send" button in the upper right.
124
154
  1. Search in the response returned to Postman for the string "Certified in total" which indicates the prior
125
155
  auth request was approved. You'll use this information in a later attestation.
126
- 1. Return to Inferno, scroll down in the "User Action" dialog and click the "click here to complete the test"
156
+ 1. Back in Inferno, scroll down in wait dialog and click the "click here to complete the test"
127
157
  link to allow Inferno to evaluate the pended workflow.
128
- 1. Two attestations will appear, the first stating that the prior auth request was registered in the
129
- client as pended and that it was subsequently finalized. You checked these above and can use the
130
- true link for both.
158
+ 1. The next two attestations ask whether the system displayed the claim as pended and approved at the
159
+ appropriate points in the workflow. Attest based on whether the correct strings were found in the
160
+ responses in the previous steps.
131
161
  1. Two additional "User Action" dialogs will appear requesting additional `$submit` and `$inquire`
132
162
  requests to demonstrate must support elements. This demo does not have any additional requests
133
163
  and does not attempt to demonstrate all must support elements, so click the link to indicate
134
164
  you are done submitting requests for each. Note that requests submitted during the workflow section
135
- will be evaluated and you can inspect the results under test **3.2** *Demonstrate Element Support*
165
+ will be evaluated and you can inspect the results under the Demonstrate Element Support test
136
166
  to see both passing and failing tests.
137
167
  1. Once Inferno finishes evaluating the requests, the test will complete allowing you to review the
138
168
  results, including warning and error messages as well as requests associated with each test.
139
169
 
140
- #### Optional Demo Modifications
170
+ The tests are expected to pass with the exception of the Must Support tests.
171
+
172
+ #### Optional Demo Modification: full-resource Subscription
141
173
 
142
174
  This demo uses `id-only` notifications for Pended workflow. To see a demonstration of `full-resource`
143
175
  notifications, replace the string `id-only` in the "Create Subscription Request" entry under the
144
176
  "Subscription Setup" folder in the collection with the string `full-resource` (found in an extension
145
177
  under the `_payload` element).
146
178
 
179
+ #### Optional Demo Modification: SMART Backend Services Auth
180
+
181
+ To use SMART Backend Services with the demo, choose the "SMART Backend Services" Client Security Type
182
+ option and replace the 3. Client Registration steps above with the following:
183
+
184
+ - In the **SMART JSON Web Key Set (JWKS)** input, put `https://inferno.healthit.gov/suites/custom/smart_stu2_2/.well-known/jwks.json`
185
+ - In the **Client Id** input, put `pas_demo_smart`
186
+ - Click the **SUBMIT** button
187
+ - A wait dialog will display asking the tester to confirm configuration of the client. Note the
188
+ FHIR endpoint and client id details
189
+ - Start an instance of the SMART App Launch STU2.2 test suite.
190
+ - Select the **3** Backend Services group from the list at the left and the click the "RUN TESTS"
191
+ button in the upper right.
192
+ - Fill in the following input values and then click "SUBMIT":
193
+ - **FHIR Endpoint**: from the wait dialog in the PAS Client suite
194
+ - **Scopes**: any scope string, e.g., `system/*.rs`
195
+ - **Client Id**: same value as in the corresponding input to the PAS Client tests, also displayed
196
+ in the wait dialog
197
+ - Find the access token to use for the data access request by opening test **3.2.05** Authorization
198
+ request succeeds when supplied correct information, click on the "REQUESTS" tab, clicking on the "DETAILS"
199
+ button, and expanding the "Response Body". Copy the "access_token" value, which will be a ~100 character
200
+ string of letters and numbers (e.g., eyJjbGllbnRfaWQiOiJzbWFydF9jbGllbnRfdGVzdF9kZW1vIiwiZXhwaXJhdGlvbiI6MTc0MzUxNDk4Mywibm9uY2UiOiJlZDI5MWIwNmZhMTE4OTc4In0)
201
+ - In Postman, select the *PAS Client Suite Demonstration* Collection in postman and go to the "Variables" tab
202
+ (see the collection's Overview tab for more details on what the variables control).
203
+ - In the current value for the **access_token** variable, put access token value copied from the SMART tests.
204
+ Make sure that the **session_url_path** variable has a current value of `/`.
205
+ - Back in Inferno, click link in the wait dialog confirming the configuration to continue the tests.
206
+ - A **Subscription Creation Test** wait dialog will appear.
207
+
208
+ Continue the tests according to step 4 around Subscription creation in the above instructions.
209
+
210
+ In this demonstration, the "Verify SMART Token Requests" test will also fail due to invalid
211
+ token requests sent intentionally by the SMART Backend Services server tests.
212
+
213
+ #### Optional Demo Modification: UDAP Client Credentials Auth
214
+
215
+ To use the UDAP Client Credentials with the demo, choose the "UDAP B2B Client Credentials" Client
216
+ Security Type option and replace the 3. Client Registration steps above with the following:
217
+
218
+ - In the **UDAP Client URI** input, put `http://localhost:4567/custom/udap_security/fhir`
219
+ - Click the **SUBMIT** button and a wait dialog will display asking the tester to perform UDAP dynamic
220
+ registration. Note the FHIR server endpoint displayed in the dialog.
221
+ - Start an instance of the UDAP Security Server test suite.
222
+ - Select the "Demo: Run Against the UDAP Security Client Suite" preset from the dropdown in the upper left.
223
+ - Select the **2** UDAP Client Credentials Flow group from the list at the left and the click the "RUN ALL TESTS"
224
+ button in the upper right.
225
+ - Update the **FHIR Server Base URL** input value to be the FHIR server endpoint from the wait dialog
226
+ in the PAS Client suite and then click "SUBMIT"
227
+ - Once the tests have completed, find the access token to use for the data access request by opening
228
+ test **2.3.01** OAuth token exchange request succeeds when supplied correct information, click
229
+ on the "REQUESTS" tab, clicking on the "DETAILS" button, and expanding the "Response Body".
230
+ Copy the "access_token" value, which will be a ~100 character string of letters and numbers (e.g., eyJjbGllbnRfaWQiOiJzbWFydF9jbGllbnRfdGVzdF9kZW1vIiwiZXhwaXJhdGlvbiI6MTc0MzUxNDk4Mywibm9uY2UiOiJlZDI5MWIwNmZhMTE4OTc4In0)
231
+ - In Postman, select the *PAS Client Suite Demonstration* Collection in postman and go to the "Variables" tab
232
+ (see the collection's Overview tab for more details on what the variables control).
233
+ - In the current value for the **access_token** variable, put access token value copied from the SMART tests.
234
+ Make sure that the **session_url_path** variable has a current value of `/`.
235
+ - In the PAS Client suite tab, click the link in the wait dialog to continue the tests. Do the same
236
+ for the next wait dialog that appears until a **Subscription Creation Test** wait dialog appears.
237
+
238
+ Continue the tests according to step 4 around Subscription creation in the above instructions.
239
+
240
+ In this demonstration, the "Verify UDAP Client Credentials Token Requests" test may fail due
241
+ to expired signatures if the test session has taken long enough.
242
+
243
+ ## Auth Configuration Details
244
+
245
+ When running these tests there are 3 options for authentication, which also allows
246
+ Inferno to identify which session the requests are for. The choice is made when the
247
+ session is created with the selected Client Security Type option, which determines
248
+ what details the tester needs to provide during the Client Registration tests:
249
+
250
+ - **SMART Backend Services**: the system under test will manually register
251
+ with Inferno and request access token used to access FHIR endpoints
252
+ as per the SMART Backend Services specification. It requires the
253
+ **SMART JSON Web Key Set (JWKS)** input to be populated with either a URL that resolves
254
+ to a JWKS or a raw JWKS in JSON format. Additionally, testers may provide
255
+ a **Client Id** if they want their client assigned a specific one.
256
+ - **UDAP B2B Client Credentials**: the system under test will dynamically register
257
+ with Inferno and request access tokens used to access FHIR endpoints
258
+ as per the UDAP specification. It requires the **UDAP Client URI** input
259
+ to be populated with the URI that the client will use when dynamically
260
+ registering with Inferno. This will be used to generate a client id (each
261
+ unique UDAP Client URI will always get the same client id).
262
+ - **Other Authentication**: Inferno will create a dedicated set of FHIR endpoints for this session
263
+ so that the system under test does not need to get access tokens or provide
264
+ them when interacting with Inferno during these tests. Since PAS requires
265
+ authentication of client systems, testers will be asked to attest that their
266
+ system supports another form of authentication, such as mutual authentication TLS.
267
+ This approach uses the **Session-specific URL path extension** input to create a
268
+ session-specific URL. This input can be provided for re-use across sessions, or
269
+ left blank to have Inferno generate a value.
270
+
147
271
  ## Response and Notification Content
148
272
 
149
273
  To assist in testers getting started with the PAS Client tests quickly, Inferno will generate
@@ -172,7 +296,7 @@ know ahead of time. These modifications fall into two categories:
172
296
  then Inferno will update the focus to use the ClaimResponse id that it generates.
173
297
 
174
298
  If the tester provides an input that is malformed in some way such that Inferno cannot get the details
175
- that Inferno needs to make the modifications, then the raw input will be used.
299
+ that it needs to make the modifications, then the raw input will be used.
176
300
 
177
301
  ### Response and Notification Correspondence Requirements
178
302
 
@@ -188,21 +312,21 @@ and working messages for Inferno to use.
188
312
  ### Tester-provided Response and Notification Inputs
189
313
 
190
314
  The following test inputs control Inferno messaging behavior:
191
- - **Claim approved response JSON**: If populated, this is used in the **2.2.1** "Demonstrate Approval Workflow" tests
315
+ - **Claim approved response JSON**: If populated, this is used in the "Approval Workflow" group
192
316
  to respond to `$submit` requests. The response needs to indicate to the system that the prior auth request has
193
317
  been approved.
194
- - **Claim denied response JSON**: If populated, this used in the **2.2.2** "Demonstrate Denial Workflow" tests
318
+ - **Claim denied response JSON**: If populated, this used in the "Denial Workflow" group
195
319
  to respond to `$submit` requests. The response needs to indicate to the system that the prior auth request has
196
320
  been denied.
197
- - **Claim pended response JSON**: If populated, this used in the **2.2.3** "Demonstrate Pended Workflow" tests
321
+ - **Claim pended response JSON**: If populated, this used in the "Pended Workflow" group
198
322
  to respond to `$submit` requests. The response needs to indicate to the system that the prior auth request has
199
323
  been pended.
200
- - **Claim updated notification JSON**: If populated, this used in the **2.2.3** "Demonstrate Pended Workflow" tests
324
+ - **Claim updated notification JSON**: If populated, this used in the "Pended Workflow" group
201
325
  as the event notification sent for the Subscription indicating that a decision has been finalized for the
202
326
  pended prior auth request. The content of the notification needs to match the details of the Subscription
203
- provided in the **2.1** "Subscription Setup" tests.
204
- - **Inquire approved response JSON**: If populated, this used in the **2.2.3** "Demonstrate Pended Workflow"
205
- tests to respond to `$inquire` requests. The response needs to indicate to the system that the
327
+ provided in the "Subscription Setup" group.
328
+ - **Inquire approved response JSON**: If populated, this used in the "Pended Workflow"
329
+ group to respond to `$inquire` requests. The response needs to indicate to the system that the
206
330
  prior auth request has been approved.
207
331
 
208
332
  ### Generation Logic