davinci_crd_test_kit 0.14.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/{inferno_crd_server_suite.json.erb → client_against_inferno_crd_server_suite.json.erb} +0 -33
  3. data/config/presets/{ri_crd_request_generator.json.erb → client_against_ri_crd_request_generator.json.erb} +1 -14
  4. data/config/presets/client_v221_against_inferno_crd_server_suite.json.erb +84 -0
  5. data/config/presets/client_v221_against_ri_br_provider.json.erb +31 -0
  6. data/config/presets/{ri_crd_request_generator.json_v221.json.erb → client_v221_against_ri_crd_request_generator.json.erb} +1 -1
  7. data/config/presets/{inferno_crd_client_suite.json.erb → server_against_inferno_crd_client_suite.json.erb} +0 -43
  8. data/config/presets/{ri_crd_server.json.erb → server_against_ri_crd_server.json.erb} +1 -44
  9. data/config/presets/{inferno_crd_client_suite_v221.json.erb → server_v221_against_inferno_crd_client_suite.json.erb} +48 -45
  10. data/config/presets/{inferno_crd_client_suite_prefetch_subset_v221.json.erb → server_v221_against_inferno_crd_client_suite_prefetch_subset.json.erb} +0 -46
  11. data/config/presets/server_v221_against_inferno_g31_suite.json.erb +49 -0
  12. data/lib/davinci_crd_test_kit/client/cross_hook_helper.rb +26 -0
  13. data/lib/davinci_crd_test_kit/client/endpoints/custom_service_response.rb +7 -7
  14. data/lib/davinci_crd_test_kit/client/endpoints/gather_response_generation_data.rb +4 -1
  15. data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +70 -39
  16. data/lib/davinci_crd_test_kit/client/endpoints/mock_service_response.rb +26 -7
  17. data/lib/davinci_crd_test_kit/client/endpoints/mocked_card_responses/external_reference.json +1 -1
  18. data/lib/davinci_crd_test_kit/client/endpoints/mocked_card_responses/launch_smart_app.json +0 -7
  19. data/lib/davinci_crd_test_kit/client/endpoints/scenario_service_response.rb +54 -0
  20. data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +8 -27
  21. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +35 -23
  22. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +34 -21
  23. data/lib/davinci_crd_test_kit/client/v2.0.1/cds-services-v201.json +20 -20
  24. data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +12 -10
  25. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +12 -10
  26. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +12 -10
  27. data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +5 -5
  28. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +12 -10
  29. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +12 -10
  30. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +12 -10
  31. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +3 -36
  32. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +3 -36
  33. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +3 -36
  34. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +4 -13
  35. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +3 -13
  36. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +3 -13
  37. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +3 -13
  38. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +1 -1
  39. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/attestation_instructions.rb +10 -0
  40. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_authorized_scope_attestation_test.rb +45 -0
  41. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_coverage_based_invocation_attestation_test.rb +44 -0
  42. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_data_element_expectations_attestation_test.rb +44 -0
  43. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_hook_invocation_logging_attestation_test.rb +43 -0
  44. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_must_support_exposure_attestation_test.rb +43 -0
  45. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_must_support_use_attestation_test.rb +41 -0
  46. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_order_sign_support_attestation_test.rb +42 -0
  47. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_prefetch_key_omission_attestation_test.rb +42 -0
  48. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_resource_identifiers_attestation_test.rb +43 -0
  49. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_response_case_distinction_attestation_test.rb +43 -0
  50. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_security_and_privacy_attestation_test.rb +43 -0
  51. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_workflow_integration_attestation_test.rb +44 -0
  52. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +1 -1
  53. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +29 -18
  54. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +35 -22
  55. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +47 -47
  56. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +50 -50
  57. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +24 -15
  58. data/lib/davinci_crd_test_kit/client/v2.2.1/client_attestations_group.rb +49 -0
  59. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +22 -6
  60. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_interaction_group.rb +98 -0
  61. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +19 -11
  62. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +19 -11
  63. data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +14 -12
  64. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +25 -5
  65. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +3 -2
  66. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +23 -15
  67. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +19 -11
  68. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +23 -15
  69. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +6 -0
  70. data/lib/davinci_crd_test_kit/client/v2.2.1/client_scenarios_group.rb +26 -0
  71. data/lib/davinci_crd_test_kit/client/v2.2.1/client_self_pay_hook_group.rb +36 -0
  72. data/lib/davinci_crd_test_kit/client/v2.2.1/client_unknown_content_hook_group.rb +34 -0
  73. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +24 -3
  74. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +1 -1
  75. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +4 -11
  76. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +1 -9
  77. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +6 -2
  78. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +3 -12
  79. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +8 -89
  80. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/base_hook_invocation_receive_request_test.rb +163 -0
  81. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/cross_hooks_receive_request_test.rb +97 -0
  82. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +8 -90
  83. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +8 -90
  84. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +8 -98
  85. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +8 -98
  86. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +8 -98
  87. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +10 -2
  88. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +11 -6
  89. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +2 -1
  90. data/lib/davinci_crd_test_kit/client/v2.2.1/self_pay/client_self_pay_no_request_test.rb +30 -0
  91. data/lib/davinci_crd_test_kit/client/v2.2.1/self_pay/client_self_pay_workflow_test.rb +55 -0
  92. data/lib/davinci_crd_test_kit/client/v2.2.1/unknown_content/client_unknown_content_attestation_test.rb +99 -0
  93. data/lib/davinci_crd_test_kit/client/v2.2.1/unknown_content/client_unknown_content_receive_request_test.rb +62 -0
  94. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +1 -1
  95. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +10 -2
  96. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +1 -1
  97. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +1 -1
  98. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +7 -1
  99. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +1 -1
  100. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +1 -1
  101. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +1 -1
  102. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +54 -21
  103. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +1 -1
  104. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +6 -3
  105. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +18 -0
  106. data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +30 -13
  107. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +25 -11
  108. data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +2 -0
  109. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +28 -28
  110. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +211 -43
  111. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +7 -0
  112. data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
  113. data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +6 -2
  114. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +107 -107
  115. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +101 -97
  116. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +18 -18
  117. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +43 -39
  118. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
  119. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +3 -3
  120. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_no_special_requests.rb +17 -0
  121. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_with_bad_auth.rb +14 -0
  122. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +24 -6
  123. data/lib/davinci_crd_test_kit/server/server_hook_helper.rb +2 -2
  124. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +1 -1
  125. data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +5 -5
  126. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +3 -0
  127. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_standard_prefetch_expressions_test.rb +165 -0
  128. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_single_request_test.rb +22 -0
  129. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +10 -102
  130. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +3 -2
  131. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +2 -0
  132. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +10 -97
  133. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +10 -97
  134. data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +5 -5
  135. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +10 -103
  136. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +12 -116
  137. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +12 -121
  138. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_response_group.rb +23 -0
  139. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_info_reason_test.rb +108 -0
  140. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_not_found_group.rb +116 -0
  141. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_active_coverage_group.rb +115 -0
  142. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_member_found_group.rb +117 -0
  143. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_group.rb +121 -0
  144. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_invoke_test.rb +22 -0
  145. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +1 -0
  146. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +1 -0
  147. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +1 -0
  148. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +78 -35
  149. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_card_absence_test.rb +76 -0
  150. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +70 -124
  151. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +83 -39
  152. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +59 -17
  153. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +80 -45
  154. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +37 -0
  155. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +57 -6
  156. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +56 -17
  157. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +52 -25
  158. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +17 -51
  159. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +1 -1
  160. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +1 -1
  161. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +1 -1
  162. data/lib/davinci_crd_test_kit/version.rb +2 -2
  163. metadata +54 -16
  164. data/config/presets/inferno_crd_server_suite_v221.json.erb +0 -94
  165. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/card_optional_fields_validation_test.rb +0 -57
  166. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_received_test.rb +0 -65
@@ -25,12 +25,18 @@ module DaVinciCRDTestKit
25
25
  procedures, labs and other orders). The CRD IG places [additional constraints on the use
26
26
  of the order-select hook](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/hooks.html#order-select),
27
27
  including the profiles that resources in each request must conform to.
28
+
29
+ Inferno's simulated `order-select` hook endpoints are available at:
30
+ - Complete Prefetch: `#{ClientURLs.base_url}#{ORDER_SELECT_PATH}`
31
+ - Subset Prefetch: `#{ClientURLs.base_url}#{ORDER_SELECT_PREFETCH_SUBSET_PATH}`
28
32
  DESCRIPTION
29
33
  run_as_group
30
34
 
31
35
  verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-2-A', 'hl7.fhir.us.davinci-crd_2.2.1@hook-2-B'
32
36
 
33
- input_order :cds_jwt_iss, :cds_jwk_set
37
+ input_order :order_select_response_approach,
38
+ :order_select_selected_response_types,
39
+ :order_select_custom_response_template
34
40
 
35
41
  config(
36
42
  inputs: {
@@ -53,7 +59,9 @@ module DaVinciCRDTestKit
53
59
  crd_jwks_keys_json: { name: :order_select_crd_jwks_keys_json }
54
60
  },
55
61
  options: {
56
- hook_name: 'order-select'
62
+ hook_name: 'order-select',
63
+ crd_interaction_group: 'hooks-order-select',
64
+ include_in_cross_hook_analysis: true
57
65
  }
58
66
  )
59
67
 
@@ -63,11 +71,10 @@ module DaVinciCRDTestKit
63
71
  end
64
72
 
65
73
  group do
66
- title 'Authorization'
67
- test from: :crd_v221_decode_auth_token
68
- test from: :crd_v221_retrieve_jwks
69
- test from: :crd_v221_token_header
70
- test from: :crd_v221_token_payload
74
+ title 'Response Handling'
75
+
76
+ test from: :crd_v221_card_display_attest_test
77
+ test from: :crd_v221_inferno_response_validation
71
78
  end
72
79
 
73
80
  group do
@@ -92,10 +99,11 @@ module DaVinciCRDTestKit
92
99
  end
93
100
 
94
101
  group do
95
- title 'Response Handling'
96
-
97
- test from: :crd_v221_inferno_response_validation
98
- test from: :crd_v221_card_display_attest_test
102
+ title 'Authorization'
103
+ test from: :crd_v221_decode_auth_token
104
+ test from: :crd_v221_retrieve_jwks
105
+ test from: :crd_v221_token_header
106
+ test from: :crd_v221_token_payload
99
107
  end
100
108
  end
101
109
  end
@@ -26,12 +26,18 @@ module DaVinciCRDTestKit
26
26
  for medications, procedures, labs and other orders). The CRD IG places [additional constraints on the use
27
27
  of the order-sign hook](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/hooks.html#order-sign),
28
28
  including the profiles that resources in each request must conform to.
29
+
30
+ Inferno's simulated `order-sign` hook endpoints are available at:
31
+ - Complete Prefetch: `#{ClientURLs.base_url}#{ORDER_SIGN_PATH}`
32
+ - Subset Prefetch: `#{ClientURLs.base_url}#{ORDER_SIGN_PREFETCH_SUBSET_PATH}`
29
33
  DESCRIPTION
30
34
  run_as_group
31
35
 
32
36
  verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-2-A', 'hl7.fhir.us.davinci-crd_2.2.1@hook-2-B'
33
37
 
34
- input_order :cds_jwt_iss, :cds_jwk_set
38
+ input_order :order_sign_response_approach,
39
+ :order_sign_selected_response_types,
40
+ :order_sign_custom_response_template
35
41
 
36
42
  config(
37
43
  inputs: {
@@ -54,7 +60,9 @@ module DaVinciCRDTestKit
54
60
  crd_jwks_keys_json: { name: :order_sign_crd_jwks_keys_json }
55
61
  },
56
62
  options: {
57
- hook_name: 'order-sign'
63
+ hook_name: 'order-sign',
64
+ crd_interaction_group: 'hooks-order-sign',
65
+ include_in_cross_hook_analysis: true
58
66
  }
59
67
  )
60
68
 
@@ -64,11 +72,14 @@ module DaVinciCRDTestKit
64
72
  end
65
73
 
66
74
  group do
67
- title 'Authorization'
68
- test from: :crd_v221_decode_auth_token
69
- test from: :crd_v221_retrieve_jwks
70
- test from: :crd_v221_token_header
71
- test from: :crd_v221_token_payload
75
+ title 'Response Handling'
76
+
77
+ test from: :crd_v221_card_display_attest_test
78
+ test from: :crd_v221_inferno_response_validation
79
+ test from: :crd_v221_client_hook_response_support_coverage_information do
80
+ title 'Client supports the Coverage Information response type on the order-sign hook'
81
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-39'
82
+ end
72
83
  end
73
84
 
74
85
  group do
@@ -93,14 +104,11 @@ module DaVinciCRDTestKit
93
104
  end
94
105
 
95
106
  group do
96
- title 'Response Handling'
97
-
98
- test from: :crd_v221_inferno_response_validation
99
- test from: :crd_v221_card_display_attest_test
100
- test from: :crd_v221_client_hook_response_support_coverage_information do
101
- title 'Client supports the Coverage Information response type on the order-sign hook'
102
- verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-39'
103
- end
107
+ title 'Authorization'
108
+ test from: :crd_v221_decode_auth_token
109
+ test from: :crd_v221_retrieve_jwks
110
+ test from: :crd_v221_token_header
111
+ test from: :crd_v221_token_payload
104
112
  end
105
113
  end
106
114
  end
@@ -12,6 +12,12 @@ module DaVinciCRDTestKit
12
12
  and vice-versa. Tests in this group confirm the registration of the partner
13
13
  system on both ends.
14
14
 
15
+ Inferno simulates two CRD discovery endpoints for the client to connect to:
16
+ - Discovery endpoint for services requesting the complete [standard prefetch data set](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/foundation.html#standard-prefetch):
17
+ `#{ClientURLs.discovery_url}`
18
+ - Discovery endpoint for services requesting the a subset of the [standard prefetch data set](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/foundation.html#standard-prefetch):
19
+ `#{ClientURLs.prefetch_subset_discovery_url}`
20
+
15
21
  This group must be run before any other tests in the "Hook Invocation" group because inputs
16
22
  provided to this group will be used by Inferno for the remainder of the tests
17
23
  to identify client requests and verify behavior. The inputs will appear as locked and
@@ -0,0 +1,26 @@
1
+ require_relative 'client_long_running_hook_group'
2
+ require_relative 'client_unknown_content_hook_group'
3
+ require_relative 'client_self_pay_hook_group'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V221
7
+ class ClientScenariosGroup < Inferno::TestGroup
8
+ title 'Scenarios'
9
+ id :crd_v221_client_scenarios
10
+ description <<~DESCRIPTION
11
+ This group checks CRD requirements that pertain to specific scenarios
12
+ that clients need to handle.
13
+
14
+ These scenarios test specific situations and conformance details of requests
15
+ and responses beyond those required for the scenario and for Inferno to
16
+ recognize client requests are not checked. Testers are expected to follow
17
+ the same workflows as used during other tests and should adhere to the
18
+ same CRD requirements when performing these scenarios.
19
+ DESCRIPTION
20
+
21
+ group from: :crd_v221_client_long_running_hook
22
+ group from: :crd_v221_client_unknown_content_hook
23
+ group from: :crd_v221_client_self_pay_hook
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'self_pay/client_self_pay_workflow_test'
2
+ require_relative 'self_pay/client_self_pay_no_request_test'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class ClientSelfPayHookGroup < Inferno::TestGroup
7
+ title 'Self-Pay'
8
+ id :crd_v221_client_self_pay_hook
9
+ description <<~DESCRIPTION
10
+ The CRD IG requires clients to invoke hooks on payer services only when the patient
11
+ record indicates active coverage with the payer associated with the service and there
12
+ is no recorded indication that the patient intends to bypass insurance coverage, i.e.,
13
+ the service or product is not flagged as 'self-pay'. During this scenario the tester
14
+ will perform a workflow that would normally trigger a hook request, but for a service or
15
+ product that the patient has indicated they intend to self-pay for, and Inferno
16
+ will verify that no hook requests are made.
17
+
18
+ Any hook requests made during these tests will not be checked for conformance
19
+ or included in the cross-hook analyses around must support and other coverage requirements.
20
+ DESCRIPTION
21
+
22
+ run_as_group
23
+
24
+ config(
25
+ options: {
26
+ hook_name: ANY_HOOK_TAG,
27
+ crd_interaction_group: SELF_PAY_GROUP_TAG,
28
+ include_in_cross_hook_analysis: false
29
+ }
30
+ )
31
+
32
+ test from: :crd_v221_client_self_pay_workflow
33
+ test from: :crd_v221_client_self_pay_no_request
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,34 @@
1
+ require_relative 'unknown_content/client_unknown_content_receive_request_test'
2
+ require_relative 'unknown_content/client_unknown_content_attestation_test'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class ClientUnknownContentHookGroup < Inferno::TestGroup
7
+ title 'Unknown Response Content'
8
+ id :crd_v221_client_unknown_content_hook
9
+ description <<~DESCRIPTION
10
+ CRD servers may return content that clients do not recognize, and the CRD IG requires
11
+ clients to ignore it rather than fail. During this scenario Inferno returns coverage
12
+ information accompanied by an element within the system action and a custom extension
13
+ on the response, both with randomly generated names. This content is added at the CRD
14
+ response level rather than within the FHIR resources carried in the response.
15
+
16
+ Hook requests made during these tests will not be checked for conformance
17
+ or included in the cross-hook analyses around must support and other coverage requirements.
18
+ DESCRIPTION
19
+
20
+ run_as_group
21
+
22
+ config(
23
+ options: {
24
+ hook_name: ANY_HOOK_TAG,
25
+ crd_interaction_group: UNKNOWN_CONTENT_GROUP_TAG,
26
+ include_in_cross_hook_analysis: false
27
+ }
28
+ )
29
+
30
+ test from: :crd_v221_client_unknown_content_receive_request
31
+ test from: :crd_v221_client_unknown_content_attestation_test
32
+ end
33
+ end
34
+ end
@@ -2,7 +2,8 @@ require_relative 'client_fhir_api_group'
2
2
  require_relative 'client_hooks_group'
3
3
  require_relative 'client_cross_hook_group'
4
4
  require_relative 'client_registration_group'
5
- require_relative 'client_long_running_hook_group'
5
+ require_relative 'client_scenarios_group'
6
+ require_relative 'client_attestations_group'
6
7
  require_relative '../endpoints/cds_services_discovery_handler'
7
8
  require_relative '../../cross_suite/tags'
8
9
  require_relative 'client_urls'
@@ -23,6 +24,11 @@ module DaVinciCRDTestKit
23
24
  capabilities of a CRD client as described in [version 2.2.1](https://hl7.org/fhir/us/davinci-crd/2.2.1)
24
25
  of the Da Vinci Coverage Requirements Discovery (CRD) Implementation Guide.
25
26
 
27
+ These tests are a **DRAFT** intended to allow CRD implementers to perform
28
+ preliminary checks of their implementations against the CRD IG requirements and
29
+ [provide feedback](https://github.com/inferno-framework/davinci-crd-test-kit/issues) on the tests.
30
+ Future versions of these tests may validate other requirements and may change how these are tested.
31
+
26
32
  Detailed information about this test suite can be found in the
27
33
  [client section](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Details) of the
28
34
  [CRD Test Kit Wiki](https://github.com/inferno-framework/davinci-crd-test-kit/wiki), including:
@@ -109,7 +115,6 @@ module DaVinciCRDTestKit
109
115
  CRD_MESSAGE_FILTERS = [
110
116
  /\A\S+: \S+: URL value '.*' does not resolve/,
111
117
  %r{This element is not allowed by the profile http://hl7\.org/fhir/tools/StructureDefinition/CDSHooksExtensions\|1\.1\.2},
112
- /CDSHooksRequest.extension: Unrecognized property/,
113
118
  /No definition could be found for URL value/
114
119
  ].freeze
115
120
 
@@ -162,6 +167,21 @@ module DaVinciCRDTestKit
162
167
  end
163
168
  end
164
169
 
170
+ fhir_resource_validator :no_custom_extensions do
171
+ igs('hl7.fhir.us.davinci-crd#2.2.1')
172
+
173
+ validation_context do
174
+ snomedCT '731000124108' # explicit snomedCT expansion parameter
175
+ extensions [] # no extensions not in the spec
176
+ end
177
+
178
+ exclude_message do |message|
179
+ CRD_MESSAGE_FILTERS.any? do |match_template|
180
+ message.message.match?(match_template)
181
+ end
182
+ end
183
+ end
184
+
165
185
  suite_option :us_core_version,
166
186
  title: 'US Core Version',
167
187
  list_options: [
@@ -219,11 +239,12 @@ module DaVinciCRDTestKit
219
239
 
220
240
  group from: :crd_v221_client_registration
221
241
  group from: :crd_v221_client_hooks
242
+ group from: :crd_v221_client_scenarios
222
243
  group from: :crd_v221_client_cross_hook
223
- group from: :crd_v221_client_long_running_hook
224
244
  end
225
245
 
226
246
  group from: :crd_v221_client_fhir_api
247
+ group from: :crd_v221_client_attestations
227
248
  end
228
249
  end
229
250
  end
@@ -46,7 +46,7 @@ module DaVinciCRDTestKit
46
46
  end
47
47
 
48
48
  run do
49
- loaded_requests = requests_to_analyze
49
+ loaded_requests = load_requests_for_cross_hook_analysis
50
50
  skip_if loaded_requests.blank?, 'No hook requests received.'
51
51
 
52
52
  sorted_cards = sorted_cards_from_requests(loaded_requests)
@@ -1,6 +1,10 @@
1
+ require_relative '../../cross_hook_helper'
2
+
1
3
  module DaVinciCRDTestKit
2
4
  module V221
3
5
  class ClientFHIRPathCollectionAsCommaDelimitedStringTest < Inferno::Test
6
+ include CrossHookHelper
7
+
4
8
  title 'Client correctly interprets collections when substituting FHIRPath results in prefetch templates'
5
9
  id :crd_v221_client_fhir_path_collection_as_comma_delimited_string
6
10
  description <<~DESCRIPTION
@@ -32,17 +36,6 @@ module DaVinciCRDTestKit
32
36
  'Perform more complex hook requests and re-run.'
33
37
  end
34
38
 
35
- def find_completeness_tests
36
- hooks_group = self.class.parent.parent.groups.find do |group|
37
- group.id.to_s.include?('crd_v221_client_hooks')
38
- end
39
- hooks_group.groups.map do |group|
40
- group.groups.flat_map(&:tests).find do |test|
41
- test.id.to_s.include?('crd_v221_hook_request_prefetch_complete')
42
- end
43
- end.compact
44
- end
45
-
46
39
  def completeness_tests_demonstrate_collection_token_substitution?(prefetch_completeness_tests)
47
40
  results_repo = Inferno::Repositories::Results.new
48
41
  results = results_repo.current_results_for_test_session_and_runnables(test_session_id,
@@ -1,11 +1,9 @@
1
- require_relative '../../tagged_request_load_helper'
2
1
  require_relative '../../multi_request_message_helper'
3
2
  require_relative '../../../cross_suite/tags'
4
3
 
5
4
  module DaVinciCRDTestKit
6
5
  module V221
7
6
  class ClientHookInstancesUniqueTest < Inferno::Test
8
- include TaggedRequestLoadHelper
9
7
  include MultiRequestMessageHelper
10
8
 
11
9
  title 'Client does not reuse hookInstance values'
@@ -21,14 +19,8 @@ module DaVinciCRDTestKit
21
19
 
22
20
  verifies_requirements 'cds-hooks_3.0.0-ballot@25'
23
21
 
24
- config(
25
- options: {
26
- crd_test_group: DUPLICATED_HOOK_INSTANCE_TAG
27
- }
28
- )
29
-
30
22
  run do
31
- duplicated_hook_instance_requests = load_hook_requests
23
+ duplicated_hook_instance_requests = load_tagged_requests(DUPLICATED_HOOK_INSTANCE_TAG)
32
24
  reused_values = duplicated_hook_instance_requests.map.with_index do |request, request_index|
33
25
  request_body = parse_json_request_entity(request.request_body, 'Request body', request_index)
34
26
  next nil unless request_body.present?
@@ -70,7 +70,11 @@ module DaVinciCRDTestKit
70
70
 
71
71
  message_prefix = "Parent of prefetched 'Location/#{root_id}'"
72
72
  add_message('error', "Location/#{location.id}: #{message_prefix} does not conform to the CRD Location profile.")
73
- validator_response_details.each { |issue| add_message(issue.severity, "(#{message_prefix}) #{issue.message}") }
73
+ validator_response_details.each do |issue|
74
+ next if issue.filtered
75
+
76
+ add_message(issue.severity, "(#{message_prefix}) #{issue.message}")
77
+ end
74
78
  end
75
79
 
76
80
  def fetched_locations_checked_for_conformance
@@ -78,7 +82,7 @@ module DaVinciCRDTestKit
78
82
  end
79
83
 
80
84
  def loaded_requests
81
- @loaded_requests ||= requests_to_analyze
85
+ @loaded_requests ||= load_requests_for_cross_hook_analysis
82
86
  end
83
87
 
84
88
  def prefetched_location_hash
@@ -1,10 +1,12 @@
1
1
  require_relative '../../tagged_request_load_helper'
2
+ require_relative '../../cross_hook_helper'
2
3
  require_relative '../client_urls'
3
4
 
4
5
  module DaVinciCRDTestKit
5
6
  module V221
6
7
  class ClientPrefetchCompleteAndSubsetTest < Inferno::Test
7
8
  include TaggedRequestLoadHelper
9
+ include CrossHookHelper
8
10
 
9
11
  title 'Client can provide both the complete standard prefetch data set and a subset'
10
12
  id :crd_v221_client_prefetch_complete_and_subset
@@ -50,7 +52,7 @@ module DaVinciCRDTestKit
50
52
 
51
53
  run do
52
54
  subset_prefetch_requests, complete_prefetch_requests =
53
- requests_to_analyze.partition { |request| request.url.include?(PREFETCH_SUBSET_PREFIX) }
55
+ load_requests_for_cross_hook_analysis.partition { |request| request.url.include?(PREFETCH_SUBSET_PREFIX) }
54
56
  completeness_tests = find_completeness_tests
55
57
  check_for_demonstration(subset_prefetch_requests, completeness_tests, :subset)
56
58
  check_for_demonstration(complete_prefetch_requests, completeness_tests, :complete)
@@ -59,17 +61,6 @@ module DaVinciCRDTestKit
59
61
  'The client did not demonstrate both complete and subset prefetch capability. See Messages for details.'
60
62
  end
61
63
 
62
- def find_completeness_tests
63
- hooks_group = self.class.parent.parent.groups.find do |group|
64
- group.id.to_s.include?('crd_v221_client_hooks')
65
- end
66
- hooks_group.groups.map do |group|
67
- group.groups.flat_map(&:tests).find do |test|
68
- test.id.to_s.include?('crd_v221_hook_request_prefetch_complete')
69
- end
70
- end.compact
71
- end
72
-
73
64
  def check_for_demonstration(requests, completeness_tests, target_name)
74
65
  unless requests.present?
75
66
  add_message('error', "No requests made to the service endpoint requesting #{target_name} prefetch data.")
@@ -1,10 +1,8 @@
1
- require_relative '../client_urls'
1
+ require_relative 'base_hook_invocation_receive_request_test'
2
2
 
3
3
  module DaVinciCRDTestKit
4
4
  module V221
5
- class AppointmentBookReceiveRequestTest < Inferno::Test
6
- include ClientURLs
7
-
5
+ class AppointmentBookReceiveRequestTest < BaseHookInvocationReceiveRequestTest
8
6
  id :crd_v221_appointment_book_request
9
7
  title 'Client invokes the appointment-book hook'
10
8
  description %(
@@ -19,16 +17,7 @@ module DaVinciCRDTestKit
19
17
  by the tester by clicking on the link in the "User Action Required" dialog (NOTE: after
20
18
  5 minutes the test will become inactive and unresponsive to anything except cancelation).
21
19
  )
22
- config options: { accepts_multiple_requests: true }
23
20
 
24
- input :cds_jwt_iss,
25
- title: 'CRD JWT Issuer',
26
- description: %(
27
- Value of the `iss` claim that must be present in the JWT used to authorize the client's hook
28
- request sent as the Bearer token in the `Authorization` header.
29
- Run or re-run the "Registration" group to set or change this value.
30
- ),
31
- locked: true
32
21
  input :appointment_book_response_approach,
33
22
  title: 'Response generation approach for appointment-book',
34
23
  description: %(
@@ -60,34 +49,7 @@ module DaVinciCRDTestKit
60
49
  type: 'checkbox',
61
50
  default: ['coverage_information', 'external_reference', 'instructions'],
62
51
  optional: true,
63
- options: {
64
- list_options: [
65
- {
66
- label: 'External Reference',
67
- value: 'external_reference'
68
- },
69
- {
70
- label: 'Instructions',
71
- value: 'instructions'
72
- },
73
- {
74
- label: 'Coverage Information',
75
- value: 'coverage_information'
76
- },
77
- {
78
- label: 'Request Form Completion',
79
- value: 'request_form_completion'
80
- },
81
- {
82
- label: 'Create/Update Coverage Information',
83
- value: 'create_update_coverage_info'
84
- },
85
- {
86
- label: 'Launch SMART Application',
87
- value: 'launch_smart_app'
88
- }
89
- ]
90
- },
52
+ options: { list_options: RESPONSE_TYPE_OPTIONS },
91
53
  enable_when: { input_name: 'appointment_book_response_approach', value: 'mocked' }
92
54
  input :appointment_book_custom_response_template,
93
55
  title: 'Custom response template for appointment-book hook requests',
@@ -98,58 +60,15 @@ module DaVinciCRDTestKit
98
60
  type: 'textarea',
99
61
  optional: true,
100
62
  enable_when: { input_name: 'appointment_book_response_approach', value: 'custom' }
101
- output :continuation_url
102
-
103
- def configured_response_details
104
- if appointment_book_response_approach == 'custom'
105
- # rubocop:disable Layout/LineLength
106
- 'When responding, Inferno will evaluate the provided [custom response template](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#tester-directed-custom-responses) ' \
107
- 'from the **Custom response template for appointment-book hook requests** input ' \
108
- 'against the incoming request to create a response.'
109
- # rubocop:enable Layout/LineLength
110
63
 
111
- else
112
- # rubocop:disable Layout/LineLength
113
- 'When responding, Inferno will [mock](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#mocked-responses) ' \
114
- 'the following response types using the incoming request: ' \
115
- "\n - #{selected_response_types_string}"
116
- # rubocop:enable Layout/LineLength
117
- end
118
- end
64
+ private
119
65
 
120
- def selected_response_types_string
121
- if appointment_book_selected_response_types.present?
122
- appointment_book_selected_response_types.join("\n - ")
123
- else
124
- 'Coverage Information' # primary hook default
125
- end
66
+ def hook_key
67
+ 'appointment_book'
126
68
  end
127
69
 
128
- run do
129
- identifier = cds_jwt_iss
130
- continuation_url = "#{resume_pass_url}?token=#{identifier}"
131
- output(continuation_url:)
132
-
133
- wait(
134
- identifier:,
135
- message: %(
136
- **Invoke the `appointment-book` hook**:
137
-
138
- Invoke the appointment-book hook by sending requests to
139
- one or both of the two Inferno simulated CRD servers:
140
-
141
- - Complete Prefetch: `#{appointment_book_url}`
142
- - Subset Prefetch: `#{appointment_book_prefetch_subset_url}`
143
-
144
- For Inferno to recognize these requests and associate them with this session,
145
- the authentication JWT sent as a Bearer token in the Authorization header
146
- must have `#{cds_jwt_iss}` as the `iss` claim in the JWT payload.
147
-
148
- #{configured_response_details}
149
-
150
- [Click here](#{continuation_url}) when you have finished submitting requests.
151
- )
152
- )
70
+ def primary_hook?
71
+ true
153
72
  end
154
73
  end
155
74
  end