davinci_crd_test_kit 0.14.0 → 0.14.1

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/inferno_crd_client_suite_v221.json.erb +64 -0
  3. data/config/presets/inferno_crd_server_suite_v221.json.erb +2 -2
  4. data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +12 -6
  5. data/lib/davinci_crd_test_kit/client/endpoints/mocked_card_responses/external_reference.json +1 -1
  6. data/lib/davinci_crd_test_kit/client/endpoints/mocked_card_responses/launch_smart_app.json +0 -7
  7. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +8 -1
  8. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +7 -1
  9. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +7 -1
  10. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +20 -0
  11. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +1 -1
  12. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +7 -1
  13. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +7 -1
  14. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +7 -1
  15. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +6 -0
  16. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +5 -0
  17. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +10 -5
  18. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +2 -1
  19. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +6 -0
  20. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +2 -1
  21. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +9 -0
  22. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +25 -11
  23. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +2 -1
  24. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +164 -3
  25. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +4 -0
  26. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +38 -38
  27. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +3 -3
  28. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_no_special_requests.rb +17 -0
  29. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_with_bad_auth.rb +14 -0
  30. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +24 -6
  31. data/lib/davinci_crd_test_kit/server/server_hook_helper.rb +2 -2
  32. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +3 -0
  33. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_standard_prefetch_expressions_test.rb +166 -0
  34. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_single_request_test.rb +22 -0
  35. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +10 -102
  36. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +1 -0
  37. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +2 -0
  38. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +10 -97
  39. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +10 -97
  40. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +10 -103
  41. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +12 -116
  42. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +12 -121
  43. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_response_group.rb +23 -0
  44. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_info_reason_test.rb +108 -0
  45. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_not_found_group.rb +116 -0
  46. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_active_coverage_group.rb +115 -0
  47. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_member_found_group.rb +117 -0
  48. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_group.rb +121 -0
  49. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_invoke_test.rb +22 -0
  50. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +1 -0
  51. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +1 -0
  52. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +1 -0
  53. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +78 -35
  54. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_card_absence_test.rb +76 -0
  55. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +70 -124
  56. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +83 -39
  57. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +59 -17
  58. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +80 -45
  59. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +37 -0
  60. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +57 -6
  61. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +56 -17
  62. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +52 -25
  63. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +17 -51
  64. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +1 -1
  65. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +1 -1
  66. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +1 -1
  67. data/lib/davinci_crd_test_kit/version.rb +2 -2
  68. metadata +18 -8
  69. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/card_optional_fields_validation_test.rb +0 -57
  70. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_received_test.rb +0 -65
@@ -0,0 +1,166 @@
1
+ require_relative '../../server_test_helper'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V221
5
+ class DiscoveryStandardPrefetchExpressionsTest < Inferno::Test
6
+ include DaVinciCRDTestKit::ServerTestHelper
7
+
8
+ title 'Server uses standard prefetch expressions'
9
+ id :crd_v221_discovery_standard_prefetch_expressions
10
+ description %(
11
+ This test checks each prefetch expression value advertised by CRD services in the discovery
12
+ response against the standard prefetch expressions listed in the CRD IG for the service hook. If a prefetch
13
+ expression does not match one of the standard expressions for that hook, the test will add a warning.
14
+
15
+ These warnings should be checked individually, as the interpretation of the warning will depend on the server's
16
+ intent: For expressions that are intended to capture any of the data elements in that hook's set of
17
+ [standard prefetch queries](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/foundation.html#appointment-book-prefetch),
18
+ it must match the corresponding expression in the IG, and the warning should be considered an error. Note that
19
+ the expression keys do not need to match and are ignored by this test. FHIRPath alternative ordering is also
20
+ ignored by this test.
21
+ For expressions that are meant to capture other data in addition to what is captured by the standard prefetch
22
+ queries, the warning can be ignored.
23
+ )
24
+
25
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@found-29'
26
+
27
+ input :cds_services
28
+ input :crd_discovery_service_ignore_list,
29
+ optional: true
30
+
31
+ ALL_HOOKS = [
32
+ 'appointment-book',
33
+ 'encounter-start',
34
+ 'encounter-discharge',
35
+ 'order-dispatch',
36
+ 'order-select',
37
+ 'order-sign'
38
+ ].freeze
39
+
40
+ def ignored_service_ids
41
+ crd_discovery_service_ignore_list.to_s.split(',').map(&:strip).reject(&:blank?)
42
+ end
43
+
44
+ def services_for_crd_validation(services)
45
+ services
46
+ .select { |service| ignored_service_ids.include?(service['id']) }
47
+ .each do |service|
48
+ info "Ignoring service `#{service['id']}` because it is in the ignore list."
49
+ end
50
+
51
+ services.reject { |service| ignored_service_ids.include?(service['id']) }
52
+ end
53
+
54
+ # rubocop:disable Layout/LineLength
55
+ def standard_prefetch_expressions(hook)
56
+ case hook
57
+ when 'appointment-book'
58
+ {
59
+ 'patient' => 'Patient/{{context.patientId}}',
60
+ 'encounter' => 'Encounter/{{context.encounterId}}',
61
+ 'coverage' => 'Coverage?patient={{context.patientId}}&status=active',
62
+ 'deviceRequests' => "DeviceRequest?_id={{context.appointments.entry.resource.basedOn.extension('http://hl7.org/fhir/StructureDefinition/alternate-reference').value.resolve().ofType(DeviceRequest).id}}",
63
+ 'serviceRequests' => 'ServiceRequest?_id={{context.appointments.entry.resource.basedOn.resolve().ofType(ServiceRequest).id}}',
64
+ 'medicationRequests' => "MedicationRequest?_id={{context.appointments.entry.resource.basedOn.extension('http://hl7.org/fhir/StructureDefinition/alternate-reference').value.resolve().ofType(MedicationRequest).id}}",
65
+ 'devices' => 'Device?_id={{%deviceRequests.entry.resource.code.resolve().id}}',
66
+ 'medications' => 'Medication?_id={{%medicationRequests.entry.resource.medication.resolve().id}}',
67
+ 'practitionerRoles' => 'PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id|context.appointments.entry.resource.participant.actor.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id}}',
68
+ 'practitioners' => 'Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id|context.appointments.entry.resource.participant.actor.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id}}',
69
+ 'organizations' => 'Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id|%medicationRequests.entry.resource.dispenseRequest.performer.resolve().ofType(Organization).id|%serviceRequests.entry.resource.performer.resolve().ofType(Organization).id}}',
70
+ 'locations' => 'Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id|context.appointments.entry.resource.participant.actor.resolve().ofType(Location).id|%serviceRequests.entry.resource.locationReference.resolve().ofType(Location).id}}'
71
+ }
72
+ when 'encounter-start', 'encounter-discharge'
73
+ {
74
+ 'patient' => 'Patient/{{context.patientId}}',
75
+ 'encounter' => 'Encounter/{{context.encounterId}}',
76
+ 'coverage' => 'Coverage?patient={{context.patientId}}&status=active',
77
+ 'practitionerRoles' => 'PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id}}',
78
+ 'practitioners' => 'Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id}}',
79
+ 'organizations' => 'Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id}}',
80
+ 'locations' => 'Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id}}'
81
+ }
82
+ when 'order-dispatch'
83
+ {
84
+ 'patient' => 'Patient/{{context.patientId}}',
85
+ 'encounter' => 'Encounter/{{context.encounterId}}',
86
+ 'coverage' => 'Coverage?patient={{context.patientId}}&status=active',
87
+ 'communicationRequests' => 'CommunicationRequest?_id={{context.dispatchedOrders.resolve().ofType(CommunicationRequest).id}}',
88
+ 'deviceRequests' => 'DeviceRequest?_id={{context.dispatchedOrders.resolve().ofType(DeviceRequest).id}}',
89
+ 'medicationRequests' => 'MedicationRequest?_id={{context.dispatchedOrders.resolve().ofType(MedicationRequest).id}}',
90
+ 'nutritionOrders' => 'NutritionOrder?_id={{context.dispatchedOrders.resolve().ofType(NutritionOrder).id}}',
91
+ 'serviceRequests' => 'ServiceRequest?_id={{context.dispatchedOrders.resolve().ofType(ServiceRequest).id}}',
92
+ 'visionPrescriptions' => 'VisionPrescription?_id={{context.dispatchedOrders.resolve().ofType(VisionPrescription).id}}',
93
+ 'devices' => 'Device?_id={{%deviceRequests.entry.resource.code.resolve().id}}',
94
+ 'medications' => 'Medication?_id={{%medicationRequests.entry.resource.medication.resolve().id}}',
95
+ 'practitionerRoles' => 'PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id|%communicationRequests.entry.resource.sender.resolve().ofType(PractitionerRole).id|%communicationRequests.entry.resource.recipient.resolve().ofType(PractitionerRole).id|%communicationRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%nutritionOrders.entry.resource.orderer.resolve().ofType(PractitionerRole).id|%visionPrescriptions.entry.resource.prescriber.resolve().ofType(PractitionerRole).id}}',
96
+ 'practitioners' => 'Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id|%communicationRequests.entry.resource.sender.resolve().ofType(Practitioner).id|%communicationRequests.entry.resource.recipient.resolve().ofType(Practitioner).id|%communicationRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%nutritionOrders.entry.resource.orderer.resolve().ofType(Practitioner).id|%visionPrescriptions.entry.resource.prescriber.resolve().ofType(Practitioner).id}}',
97
+ 'organizations' => 'Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id|%communicationRequests.entry.resource.recipient.resolve().ofType(Organization).id|%communicationRequests.entry.resource.sender.resolve().ofType(Organization).id|%medicationRequests.entry.resource.dispenseRequest.performer.resolve().id|%serviceRequests.entry.resource.performer.resolve().ofType(Organization).id}}',
98
+ 'locations' => 'Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id|%serviceRequests.entry.resource.locationReference.resolve().id}}'
99
+ }
100
+ when 'order-select', 'order-sign'
101
+ {
102
+ 'patient' => 'Patient/{{context.patientId}}',
103
+ 'encounter' => 'Encounter/{{context.encounterId}}',
104
+ 'coverage' => 'Coverage?patient={{context.patientId}}&status=active',
105
+ 'devices' => 'Device?_id={{context.draftOrders.entry.resource.ofType(DeviceRequest).code.resolve().id}}',
106
+ 'medications' => 'Medication?_id={{context.draftOrders.entry.resource.ofType(MedicationRequest).medication.resolve().id}}',
107
+ 'practitionerRoles' => 'PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.sender.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.recipient.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.requester.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.performer.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.orderer.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.prescriber.resolve().ofType(PractitionerRole).id}}',
108
+ 'practitioners' => 'Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.sender.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.recipient.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.requester.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.performer.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.orderer.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.prescriber.resolve().ofType(Practitioner).id}}',
109
+ 'organizations' => 'Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id|context.draftOrders.entry.resource.dispenseRequest.performer.resolve().id|context.draftOrders.entry.resource.sender.resolve().ofType(Organization).id|context.draftOrders.entry.resource.recipient.resolve().ofType(Organization).id|context.draftOrders.entry.resource.performer.resolve().ofType(Organization).id}}',
110
+ 'locations' => 'Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id|context.draftOrders.entry.resource.locationReference.resolve().id}}'
111
+ }
112
+ end
113
+ end
114
+ # rubocop:enable Layout/LineLength
115
+
116
+ # The IG examples contain FHIRPath alternatives separated by `|`, and CDS Hooks prefetch field names can vary.
117
+ # Build a canonical signature so alternative ordering and `%prefetchKey` names do not affect matching.
118
+ def expression_signature(expression)
119
+ expression = expression.to_s
120
+ # CRD's standard expressions use one `{{...}}` token; split that token into its surrounding request string.
121
+ match = expression.match(/\A(.*?)\{\{(.*)\}\}(.*)\z/)
122
+ return expression unless match
123
+
124
+ prefix, fhirpath_expression, suffix = match.captures
125
+ alternatives =
126
+ fhirpath_expression
127
+ .split('|')
128
+ .map { |alternative| alternative.gsub(/%[A-Za-z][A-Za-z0-9_-]*/, '%prefetch') }
129
+ .uniq
130
+ .sort
131
+
132
+ [prefix, alternatives, suffix]
133
+ end
134
+
135
+ run do
136
+ object = parse_json(cds_services)
137
+ assert object['services'], 'Discovery response did not contain `services`'
138
+
139
+ services = object['services']
140
+ assert services.is_a?(Array), 'Services field of the CDS Discovery response object is not an array.'
141
+
142
+ prefetch_services =
143
+ services_for_crd_validation(services)
144
+ .select { |service| service['prefetch'].is_a?(Hash) && service['prefetch'].present? }
145
+
146
+ skip_if prefetch_services.blank?, 'No CRD services advertised prefetch support'
147
+
148
+ prefetch_services.each do |service|
149
+ next unless ALL_HOOKS.include?(service['hook'])
150
+
151
+ standard_expression_signatures =
152
+ standard_prefetch_expressions(service['hook']).values.map { |expression| expression_signature(expression) }
153
+
154
+ service['prefetch'].each do |prefetch_key, prefetch_value|
155
+ next if standard_expression_signatures.include?(expression_signature(prefetch_value))
156
+
157
+ msg = "Service `#{service['id']}` advertises prefetch expression `#{prefetch_value}` " \
158
+ "for hook `#{service['hook']}` in prefetch field `#{prefetch_key}`, which does not match " \
159
+ 'one of the standard CRD prefetch expressions for that hook.'
160
+ add_message('warning', msg)
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../server_urls'
2
+ require_relative '../../jobs/invoke_hook_no_special_requests'
3
+ require_relative '../../server_abstract_invoke_hook_test'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V221
7
+ class InvokeHookSingleTest < ServerAbstractInvokeHookTest
8
+ include ServerURLs
9
+
10
+ title 'Inferno invokes the selected hook with the provided request body'
11
+ id :crd_v221_server_invoke_hook_single_request_test
12
+
13
+ def perform_invoke_hook_job(*)
14
+ Inferno::Jobs.perform(DaVinciCRDTestKit::Jobs::InvokeHookNoSpecialRequests, *)
15
+ end
16
+
17
+ def check_request_length(payloads)
18
+ skip_if payloads.length != 1, 'This test supports only one request body.'
19
+ end
20
+ end
21
+ end
22
+ end
@@ -4,10 +4,9 @@ require_relative 'verify_request/service_request_required_fields_validation_test
4
4
  require_relative 'verify_request/service_request_optional_fields_validation_test'
5
5
  require_relative 'verify_request/service_request_context_validation_test'
6
6
  require_relative 'verify_response/service_response_validation_test'
7
- require_relative 'verify_response/card_optional_fields_validation_test'
8
7
  require_relative 'verify_response/external_reference_card_validation_test'
9
- require_relative 'verify_response/coverage_information_system_action_received_test'
10
8
  require_relative 'verify_response/coverage_information_system_action_validation_test'
9
+ require_relative 'verify_response/coverage_information_card_absence_test'
11
10
  require_relative 'verify_response/coverage_info_configuration_test'
12
11
  require_relative 'verify_response/instructions_card_received_test'
13
12
  require_relative 'verify_response/form_completion_response_validation_test'
@@ -73,6 +72,7 @@ module DaVinciCRDTestKit
73
72
 
74
73
  group do
75
74
  title 'Requests'
75
+ simulation_verification
76
76
 
77
77
  test from: :crd_v221_service_request_required_fields_validation,
78
78
  config: {
@@ -96,84 +96,11 @@ module DaVinciCRDTestKit
96
96
  group do
97
97
  title 'Responses'
98
98
 
99
- test from: :crd_v221_service_response_validation,
100
- config: {
101
- outputs: {
102
- valid_cards: {
103
- name: :appointment_book_valid_cards
104
- },
105
- valid_system_actions: {
106
- name: :appointment_book_valid_system_actions
107
- }
108
- }
109
- }
110
- test from: :crd_v221_card_optional_fields_validation,
111
- config: {
112
- inputs: {
113
- valid_cards: {
114
- name: :appointment_book_valid_cards
115
- }
116
- },
117
- outputs: {
118
- valid_cards_with_links: {
119
- name: :appointment_book_valid_cards_with_links
120
- },
121
- valid_cards_with_suggestions: {
122
- name: :appointment_book_valid_cards_with_suggestions
123
- }
124
- }
125
- }
126
- test from: :crd_v221_external_reference_card_validation,
127
- config: {
128
- inputs: {
129
- valid_cards_with_links: {
130
- name: :appointment_book_valid_cards_with_links
131
- }
132
- }
133
- }
134
- test from: :crd_v221_launch_smart_app_card_validation,
135
- config: {
136
- inputs: {
137
- valid_cards_with_links: {
138
- name: :appointment_book_valid_cards_with_links
139
- }
140
- }
141
- }
142
- test from: :crd_v221_valid_instructions_card_received,
143
- config: {
144
- inputs: {
145
- valid_cards: {
146
- name: :appointment_book_valid_cards
147
- }
148
- }
149
- }
150
- test from: :crd_v221_coverage_info_system_action_received,
151
- config: {
152
- inputs: {
153
- valid_system_actions: {
154
- name: :appointment_book_valid_system_actions
155
- }
156
- },
157
- outputs: {
158
- coverage_info: {
159
- name: :appointment_book_coverage_info
160
- }
161
- }
162
- },
163
- verifies_requirements: [
164
- 'hl7.fhir.us.davinci-crd_2.2.1@resp-26'
165
- ]
166
- test from: :crd_v221_coverage_info_system_action_validation,
167
- config: {
168
- inputs: {
169
- coverage_info: {
170
- name: :appointment_book_coverage_info
171
- }
172
- }
173
- },
174
- verifies_requirements: [
175
- 'hl7.fhir.us.davinci-crd_2.2.1@resp-25'
176
- ]
99
+ test from: :crd_v221_service_response_validation
100
+ test from: :crd_v221_external_reference_card_validation
101
+ test from: :crd_v221_launch_smart_app_card_validation
102
+ test from: :crd_v221_valid_instructions_card_received
103
+ test from: :crd_v221_coverage_info_system_action_validation
177
104
  test from: :crd_v221_all_responses_include_coverage_information,
178
105
  verifies_requirements: [
179
106
  'hl7.fhir.us.davinci-crd_2.2.1@hook-16',
@@ -181,28 +108,9 @@ module DaVinciCRDTestKit
181
108
  'hl7.fhir.us.davinci-crd_2.2.1@hook-26',
182
109
  'hl7.fhir.us.davinci-crd_2.2.1@resp-29'
183
110
  ]
184
- test from: :crd_v221_request_form_completion_response_validation,
185
- config: {
186
- inputs: {
187
- valid_system_actions: {
188
- name: :appointment_book_valid_system_actions
189
- },
190
- valid_cards_with_suggestions: {
191
- name: :appointment_book_valid_cards_with_suggestions
192
- }
193
- }
194
- }
195
- test from: :crd_v221_create_or_update_coverage_info_response_validation,
196
- config: {
197
- inputs: {
198
- valid_system_actions: {
199
- name: :appointment_book_valid_system_actions
200
- },
201
- valid_cards_with_suggestions: {
202
- name: :appointment_book_valid_cards_with_suggestions
203
- }
204
- }
205
- }
111
+ test from: :crd_v221_coverage_information_card_absence
112
+ test from: :crd_v221_request_form_completion_response_validation
113
+ test from: :crd_v221_create_or_update_coverage_info_response_validation
206
114
  test from: :crd_v221_coverage_info_configuration
207
115
  test from: :crd_v221_unknown_configuration
208
116
  test from: :crd_v221_unknown_context
@@ -51,6 +51,7 @@ module DaVinciCRDTestKit
51
51
 
52
52
  group do
53
53
  title 'Requests'
54
+ simulation_verification
54
55
 
55
56
  test from: :crd_v221_service_request_required_fields_validation,
56
57
  config: {
@@ -3,6 +3,7 @@ require_relative 'discovery/discovery_configuration_test'
3
3
  require_relative 'discovery/discovery_endpoint_test'
4
4
  require_relative 'discovery/discovery_services_validation_test'
5
5
  require_relative 'discovery/discovery_prefetch_support_test'
6
+ require_relative 'discovery/discovery_standard_prefetch_expressions_test'
6
7
 
7
8
  module DaVinciCRDTestKit
8
9
  module V221
@@ -64,6 +65,7 @@ module DaVinciCRDTestKit
64
65
  test from: :crd_v221_discovery_services_validation
65
66
  test from: :crd_v221_discovery_configuration
66
67
  test from: :crd_v221_discovery_prefetch_support
68
+ test from: :crd_v221_discovery_standard_prefetch_expressions
67
69
  end
68
70
  end
69
71
  end
@@ -4,12 +4,12 @@ require_relative 'verify_request/service_request_required_fields_validation_test
4
4
  require_relative 'verify_request/service_request_optional_fields_validation_test'
5
5
  require_relative 'verify_request/service_request_context_validation_test'
6
6
  require_relative 'verify_response/service_response_validation_test'
7
- require_relative 'verify_response/card_optional_fields_validation_test'
8
7
  require_relative 'verify_response/external_reference_card_validation_test'
9
8
  require_relative 'verify_response/launch_smart_app_card_validation_test'
10
9
  require_relative 'verify_response/instructions_card_received_test'
11
10
  require_relative 'verify_response/form_completion_response_validation_test'
12
11
  require_relative 'verify_response/create_or_update_coverage_info_response_validation_test'
12
+ require_relative 'verify_response/coverage_information_card_absence_test'
13
13
  require_relative 'verify_response/coverage_info_configuration_test'
14
14
  require_relative 'verify_response/unknown_configuration_test'
15
15
  require_relative 'verify_response/unknown_context_test'
@@ -65,6 +65,7 @@ module DaVinciCRDTestKit
65
65
 
66
66
  group do
67
67
  title 'Requests'
68
+ simulation_verification
68
69
 
69
70
  test from: :crd_v221_service_request_required_fields_validation,
70
71
  config: {
@@ -88,102 +89,14 @@ module DaVinciCRDTestKit
88
89
  group do
89
90
  title 'Responses'
90
91
 
91
- test from: :crd_v221_service_response_validation,
92
- config: {
93
- outputs: {
94
- valid_cards: {
95
- name: :encounter_discharge_valid_cards
96
- },
97
- valid_system_actions: {
98
- name: :encounter_discharge_valid_system_actions
99
- }
100
- }
101
- }
102
- test from: :crd_v221_card_optional_fields_validation,
103
- config: {
104
- inputs: {
105
- valid_cards: {
106
- name: :encounter_discharge_valid_cards
107
- }
108
- },
109
- outputs: {
110
- valid_cards_with_links: {
111
- name: :encounter_discharge_valid_cards_with_links
112
- },
113
- valid_cards_with_suggestions: {
114
- name: :encounter_discharge_valid_cards_with_suggestions
115
- }
116
- }
117
- }
118
- test from: :crd_v221_external_reference_card_validation,
119
- config: {
120
- inputs: {
121
- valid_cards_with_links: {
122
- name: :encounter_discharge_valid_cards_with_links
123
- }
124
- }
125
- }
126
- test from: :crd_v221_launch_smart_app_card_validation,
127
- config: {
128
- inputs: {
129
- valid_cards_with_links: {
130
- name: :encounter_discharge_valid_cards_with_links
131
- }
132
- }
133
- }
134
- test from: :crd_v221_valid_instructions_card_received,
135
- config: {
136
- inputs: {
137
- valid_cards: {
138
- name: :encounter_discharge_valid_cards
139
- }
140
- }
141
- }
142
- test from: :crd_v221_coverage_info_system_action_received,
143
- optional: true,
144
- config: {
145
- inputs: {
146
- valid_system_actions: {
147
- name: :encounter_discharge_valid_system_actions
148
- }
149
- },
150
- outputs: {
151
- coverage_info: {
152
- name: :encounter_discharge_coverage_info
153
- }
154
- }
155
- }
156
- test from: :crd_v221_coverage_info_system_action_validation,
157
- optional: true,
158
- config: {
159
- inputs: {
160
- coverage_info: {
161
- name: :encounter_discharge_coverage_info
162
- }
163
- }
164
- }
165
- test from: :crd_v221_request_form_completion_response_validation,
166
- config: {
167
- inputs: {
168
- valid_system_actions: {
169
- name: :encounter_discharge_valid_system_actions
170
- },
171
- valid_cards_with_suggestions: {
172
- name: :encounter_discharge_valid_cards_with_suggestions
173
- }
174
- }
175
- }
176
- test from: :crd_v221_create_or_update_coverage_info_response_validation,
177
- config: {
178
- inputs: {
179
- valid_system_actions: {
180
- name: :encounter_discharge_valid_system_actions
181
- },
182
- valid_cards_with_suggestions: {
183
- name: :encounter_discharge_valid_cards_with_suggestions
184
- }
185
- }
186
- }
92
+ test from: :crd_v221_service_response_validation
93
+ test from: :crd_v221_external_reference_card_validation
94
+ test from: :crd_v221_launch_smart_app_card_validation
95
+ test from: :crd_v221_valid_instructions_card_received
96
+ test from: :crd_v221_coverage_info_system_action_validation
97
+ test from: :crd_v221_coverage_information_card_absence
98
+ test from: :crd_v221_request_form_completion_response_validation
99
+ test from: :crd_v221_create_or_update_coverage_info_response_validation
187
100
  test from: :crd_v221_coverage_info_configuration
188
101
  test from: :crd_v221_unknown_configuration
189
102
  test from: :crd_v221_unknown_context
@@ -4,12 +4,12 @@ require_relative 'verify_request/service_request_required_fields_validation_test
4
4
  require_relative 'verify_request/service_request_optional_fields_validation_test'
5
5
  require_relative 'verify_request/service_request_context_validation_test'
6
6
  require_relative 'verify_response/service_response_validation_test'
7
- require_relative 'verify_response/card_optional_fields_validation_test'
8
7
  require_relative 'verify_response/external_reference_card_validation_test'
9
8
  require_relative 'verify_response/launch_smart_app_card_validation_test'
10
9
  require_relative 'verify_response/instructions_card_received_test'
11
10
  require_relative 'verify_response/form_completion_response_validation_test'
12
11
  require_relative 'verify_response/create_or_update_coverage_info_response_validation_test'
12
+ require_relative 'verify_response/coverage_information_card_absence_test'
13
13
  require_relative 'verify_response/coverage_info_configuration_test'
14
14
  require_relative 'verify_response/unknown_configuration_test'
15
15
  require_relative 'verify_response/unknown_context_test'
@@ -65,6 +65,7 @@ module DaVinciCRDTestKit
65
65
 
66
66
  group do
67
67
  title 'Requests'
68
+ simulation_verification
68
69
 
69
70
  test from: :crd_v221_service_request_required_fields_validation,
70
71
  config: {
@@ -88,102 +89,14 @@ module DaVinciCRDTestKit
88
89
  group do
89
90
  title 'Responses'
90
91
 
91
- test from: :crd_v221_service_response_validation,
92
- config: {
93
- outputs: {
94
- valid_cards: {
95
- name: :encounter_start_valid_cards
96
- },
97
- valid_system_actions: {
98
- name: :encounter_start_valid_system_actions
99
- }
100
- }
101
- }
102
- test from: :crd_v221_card_optional_fields_validation,
103
- config: {
104
- inputs: {
105
- valid_cards: {
106
- name: :encounter_start_valid_cards
107
- }
108
- },
109
- outputs: {
110
- valid_cards_with_links: {
111
- name: :encounter_start_valid_cards_with_links
112
- },
113
- valid_cards_with_suggestions: {
114
- name: :encounter_start_valid_cards_with_suggestions
115
- }
116
- }
117
- }
118
- test from: :crd_v221_external_reference_card_validation,
119
- config: {
120
- inputs: {
121
- valid_cards_with_links: {
122
- name: :encounter_start_valid_cards_with_links
123
- }
124
- }
125
- }
126
- test from: :crd_v221_launch_smart_app_card_validation,
127
- config: {
128
- inputs: {
129
- valid_cards_with_links: {
130
- name: :encounter_start_valid_cards_with_links
131
- }
132
- }
133
- }
134
- test from: :crd_v221_valid_instructions_card_received,
135
- config: {
136
- inputs: {
137
- valid_cards: {
138
- name: :encounter_start_valid_cards
139
- }
140
- }
141
- }
142
- test from: :crd_v221_coverage_info_system_action_received,
143
- optional: true,
144
- config: {
145
- inputs: {
146
- valid_system_actions: {
147
- name: :encounter_start_valid_system_actions
148
- }
149
- },
150
- outputs: {
151
- coverage_info: {
152
- name: :encounter_start_coverage_info
153
- }
154
- }
155
- }
156
- test from: :crd_v221_coverage_info_system_action_validation,
157
- optional: true,
158
- config: {
159
- inputs: {
160
- coverage_info: {
161
- name: :encounter_start_coverage_info
162
- }
163
- }
164
- }
165
- test from: :crd_v221_request_form_completion_response_validation,
166
- config: {
167
- inputs: {
168
- valid_system_actions: {
169
- name: :encounter_start_valid_system_actions
170
- },
171
- valid_cards_with_suggestions: {
172
- name: :encounter_start_valid_cards_with_suggestions
173
- }
174
- }
175
- }
176
- test from: :crd_v221_create_or_update_coverage_info_response_validation,
177
- config: {
178
- inputs: {
179
- valid_system_actions: {
180
- name: :encounter_start_valid_system_actions
181
- },
182
- valid_cards_with_suggestions: {
183
- name: :encounter_start_valid_cards_with_suggestions
184
- }
185
- }
186
- }
92
+ test from: :crd_v221_service_response_validation
93
+ test from: :crd_v221_external_reference_card_validation
94
+ test from: :crd_v221_launch_smart_app_card_validation
95
+ test from: :crd_v221_valid_instructions_card_received
96
+ test from: :crd_v221_coverage_info_system_action_validation
97
+ test from: :crd_v221_coverage_information_card_absence
98
+ test from: :crd_v221_request_form_completion_response_validation
99
+ test from: :crd_v221_create_or_update_coverage_info_response_validation
187
100
  test from: :crd_v221_coverage_info_configuration
188
101
  test from: :crd_v221_unknown_configuration
189
102
  test from: :crd_v221_unknown_context