davinci_crd_test_kit 0.9.0 → 0.9.1.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/davinci_crd_test_kit/card_responses/propose_alternate_request.json +2 -52
  3. data/lib/davinci_crd_test_kit/card_responses/request_form_completion.json +46 -31
  4. data/lib/davinci_crd_test_kit/cards_validation.rb +8 -4
  5. data/lib/davinci_crd_test_kit/client_hooks_group.rb +22 -660
  6. data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +17 -6
  7. data/lib/davinci_crd_test_kit/client_tests/client_appointment_book_group.rb +70 -0
  8. data/lib/davinci_crd_test_kit/client_tests/client_encounter_discharge_group.rb +71 -0
  9. data/lib/davinci_crd_test_kit/client_tests/client_encounter_start_group.rb +70 -0
  10. data/lib/davinci_crd_test_kit/client_tests/client_order_dispatch_group.rb +70 -0
  11. data/lib/davinci_crd_test_kit/client_tests/client_order_select_group.rb +72 -0
  12. data/lib/davinci_crd_test_kit/client_tests/client_order_sign_group.rb +71 -0
  13. data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +43 -23
  14. data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +19 -6
  15. data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +18 -6
  16. data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +26 -10
  17. data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +20 -11
  18. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +14 -10
  19. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +27 -110
  20. data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +18 -6
  21. data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +18 -6
  22. data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +18 -6
  23. data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +66 -29
  24. data/lib/davinci_crd_test_kit/client_tests/submitted_response_validation.rb +44 -0
  25. data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +45 -14
  26. data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +43 -26
  27. data/lib/davinci_crd_test_kit/crd_client_suite.rb +0 -4
  28. data/lib/davinci_crd_test_kit/hook_request_field_validation.rb +240 -50
  29. data/lib/davinci_crd_test_kit/mock_service_response.rb +134 -120
  30. data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +26 -42
  31. data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +24 -0
  32. data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +24 -0
  33. data/lib/davinci_crd_test_kit/server_order_select_group.rb +24 -0
  34. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +4 -1
  35. data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +8 -10
  36. data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +5 -10
  37. data/lib/davinci_crd_test_kit/tags.rb +6 -6
  38. data/lib/davinci_crd_test_kit/version.rb +1 -1
  39. metadata +9 -2
@@ -9,7 +9,7 @@ module DaVinciCRDTestKit
9
9
  ['appointment-book', 'order-dispatch', 'order-sign']
10
10
  end
11
11
 
12
- def get_card_json(filename)
12
+ def load_json_file(filename)
13
13
  json = JSON.parse(File.read(File.join(__dir__, 'card_responses', filename)))
14
14
  return json unless filename == 'launch_smart_app.json'
15
15
 
@@ -18,6 +18,15 @@ module DaVinciCRDTestKit
18
18
  json
19
19
  end
20
20
 
21
+ def request_body
22
+ @request_body ||=
23
+ JSON.parse(request.params.to_json)
24
+ end
25
+
26
+ def context
27
+ request_body['context']
28
+ end
29
+
21
30
  def format_missing_response_types(missing_response_types)
22
31
  missing_response_types
23
32
  .map do |response_type|
@@ -44,10 +53,12 @@ module DaVinciCRDTestKit
44
53
  end
45
54
  end
46
55
 
47
- def get_missing_response_types(selected_response_types, hook_card_response, hook_name)
48
- if coverage_information_required_hooks.include?(hook_name)
49
- selected_response_types.append('coverage_information').uniq!
50
- end
56
+ def coverage_information_required?
57
+ coverage_information_required_hooks.include? hook_name
58
+ end
59
+
60
+ def get_missing_response_types(hook_card_response)
61
+ selected_response_types.append('coverage_information').uniq! if coverage_information_required?
51
62
 
52
63
  selected_response_types
53
64
  .select do |response_type|
@@ -60,20 +71,25 @@ module DaVinciCRDTestKit
60
71
  end
61
72
  end
62
73
 
63
- def create_warning_messages(selected_response_types, hook_card_response, hook_name)
64
- missing_response_types = if hook_card_response.nil?
65
- selected_response_types
66
- else
67
- get_missing_response_types(selected_response_types, hook_card_response, hook_name)
68
- end
74
+ def create_warning_messages(hook_card_response)
75
+ return if custom_response.present?
76
+
77
+ missing_response_types =
78
+ if hook_card_response.nil?
79
+ selected_response_types
80
+ else
81
+ get_missing_response_types(hook_card_response)
82
+ end
69
83
 
70
84
  return if missing_response_types.empty?
71
85
 
72
86
  missing_response_types = format_missing_response_types(missing_response_types)
73
87
  missing_response_types.each do |missing_response_type|
74
- Inferno::Repositories::Messages.new.create(result_id: result.id, type: 'warning',
75
- message: %(Unable to return response type: `#{missing_response_type}`
76
- for #{hook_name} hook))
88
+ Inferno::Repositories::Messages.new.create(
89
+ result_id: result.id,
90
+ type: 'warning',
91
+ message: %(Unable to return response type: `#{missing_response_type}` for #{hook_name} hook)
92
+ )
77
93
  end
78
94
  end
79
95
 
@@ -90,7 +106,7 @@ module DaVinciCRDTestKit
90
106
  end
91
107
  end
92
108
 
93
- def update_specific_hook_card_info(card_response, hook_name)
109
+ def update_specific_hook_card_info(card_response)
94
110
  return if card_response.nil?
95
111
 
96
112
  hook_display = hook_name.split('-').map(&:capitalize).join(' ')
@@ -101,47 +117,34 @@ module DaVinciCRDTestKit
101
117
  card_response
102
118
  end
103
119
 
104
- def appointment_book_response(selected_response_types)
105
- cards_response = create_cards_and_system_actions(selected_response_types, 'appointment-book', 'appointments')
106
- hook_card_response = update_specific_hook_card_info(cards_response, 'appointment-book')
107
- create_warning_messages(selected_response_types, hook_card_response, 'appointment-book')
108
- create_card_response(hook_card_response)
109
- end
110
-
111
- def encounter_start_response(selected_response_types)
112
- cards_response = create_cards_and_system_actions(selected_response_types, 'encounter-start', 'encounterId',
113
- 'Encounter')
114
- hook_card_response = update_specific_hook_card_info(cards_response, 'encounter-start')
115
- create_warning_messages(selected_response_types, hook_card_response, 'encounter-start')
116
- create_card_response(hook_card_response)
117
- end
118
-
119
- def encounter_discharge_response(selected_response_types)
120
- cards_response = create_cards_and_system_actions(selected_response_types, 'encounter-discharge', 'encounterId',
121
- 'Encounter')
122
- hook_card_response = update_specific_hook_card_info(cards_response, 'encounter-discharge')
123
- create_warning_messages(selected_response_types, hook_card_response, 'encounter-discharge')
124
- create_card_response(hook_card_response)
120
+ def resource_to_update_field_name
121
+ {
122
+ 'appointment-book' => 'appointments',
123
+ 'encounter-start' => 'encounterId',
124
+ 'encounter-discharge' => 'encounterId',
125
+ 'order-dispatch' => 'order',
126
+ 'order-select' => 'draftOrders',
127
+ 'order-sign' => 'draftOrders'
128
+ }[hook_name]
125
129
  end
126
130
 
127
- def order_dispatch_response(selected_response_types)
128
- cards_response = create_cards_and_system_actions(selected_response_types, 'order-dispatch', 'order')
129
- hook_card_response = update_specific_hook_card_info(cards_response, 'order-dispatch')
130
- create_warning_messages(selected_response_types, hook_card_response, 'order-dispatch')
131
- create_card_response(hook_card_response)
131
+ def resource_type_to_update
132
+ {
133
+ 'encounter-start' => 'Encounter',
134
+ 'encounter-discharge' => 'Encounter'
135
+ }[hook_name]
132
136
  end
133
137
 
134
- def order_select_response(selected_response_types)
135
- cards_response = create_cards_and_system_actions(selected_response_types, 'order-select', 'draftOrders')
136
- hook_card_response = update_specific_hook_card_info(cards_response, 'order-select')
137
- create_warning_messages(selected_response_types, hook_card_response, 'order-select')
138
- create_card_response(hook_card_response)
139
- end
138
+ def hook_response
139
+ hook_card_response =
140
+ if custom_response.present?
141
+ JSON.parse(custom_response)
142
+ else
143
+ cards_response = create_cards_and_system_actions
144
+ update_specific_hook_card_info(cards_response)
145
+ end
140
146
 
141
- def order_sign_response(selected_response_types)
142
- cards_response = create_cards_and_system_actions(selected_response_types, 'order-sign', 'draftOrders')
143
- hook_card_response = update_specific_hook_card_info(cards_response, 'order-sign')
144
- create_warning_messages(selected_response_types, hook_card_response, 'order-sign')
147
+ create_warning_messages(hook_card_response)
145
148
  create_card_response(hook_card_response)
146
149
  end
147
150
 
@@ -156,7 +159,7 @@ module DaVinciCRDTestKit
156
159
  resource.entry.first.resource
157
160
  end
158
161
 
159
- def get_patient_coverage(request_body)
162
+ def get_patient_coverage # rubocop:disable Naming/AccessorMethodName
160
163
  prefetch = request_body['prefetch']
161
164
  if prefetch.present? && prefetch['coverage']
162
165
  FHIR.from_contents(prefetch['coverage'].to_json)
@@ -164,7 +167,7 @@ module DaVinciCRDTestKit
164
167
  fhir_server = request_body['fhirServer']
165
168
  if fhir_server.present?
166
169
  access_token = request_body['fhirAuthorization']['access_token'] if request_body['fhirAuthorization']
167
- patient_id = request_body['context']['patientId']
170
+ patient_id = context['patientId']
168
171
 
169
172
  make_resource_request(
170
173
  "#{fhir_server}/Coverage?patient=#{patient_id}&status=active",
@@ -174,10 +177,10 @@ module DaVinciCRDTestKit
174
177
  end
175
178
  end
176
179
 
177
- def get_context_resource(request_body, resource_type, update_resource_id)
178
- update_resource_id = "#{resource_type}/#{update_resource_id}" unless update_resource_id.include? '/'
180
+ def get_context_resource(update_resource_id)
181
+ update_resource_id = "#{resource_type_to_update}/#{update_resource_id}" unless update_resource_id.include? '/'
179
182
  fhir_server = request_body['fhirServer']
180
- return unless fhir_server.present?
183
+ return if fhir_server.blank?
181
184
 
182
185
  access_token = request_body['fhirAuthorization']['access_token'] if request_body['fhirAuthorization']
183
186
  make_resource_request(
@@ -186,27 +189,24 @@ module DaVinciCRDTestKit
186
189
  )
187
190
  end
188
191
 
189
- def add_coverage_cards?(selected_response_types, hook_name)
192
+ def add_coverage_cards?
190
193
  (['coverage_information', 'create_update_coverage_info'].any? { |x| selected_response_types.include?(x) }) ||
191
- coverage_information_required_hooks.include?(hook_name)
194
+ coverage_information_required?
192
195
  end
193
196
 
194
- def create_cards_and_system_actions(selected_response_types, hook_name, update_resource_name, resource_type = nil)
195
- request_body = JSON.parse(request.params.to_json)
196
- context = request_body['context']
197
+ def create_cards_and_system_actions
197
198
  return if context.nil?
198
199
 
199
200
  cards = []
200
201
 
201
- add_basic_cards(selected_response_types, cards, context)
202
+ add_basic_cards(cards)
202
203
 
203
- add_order_hook_cards(selected_response_types, cards, request_body, hook_name)
204
+ add_order_hook_cards(cards)
204
205
 
205
- system_actions = add_coverage_cards(selected_response_types, cards, request_body, hook_name,
206
- update_resource_name, resource_type)
206
+ system_actions = add_coverage_cards(cards)
207
207
 
208
- cards.append(get_card_json('instructions.json')) if selected_response_types.include?('instructions') ||
209
- (cards.empty? && system_actions.nil?)
208
+ cards.append(load_json_file('instructions.json')) if selected_response_types.include?('instructions') ||
209
+ (cards.empty? && system_actions.nil?)
210
210
  cards_response = { 'cards' => cards }
211
211
  cards_response['systemActions'] = system_actions if system_actions.present?
212
212
  cards_response
@@ -214,53 +214,50 @@ module DaVinciCRDTestKit
214
214
  nil
215
215
  end
216
216
 
217
- def add_order_hook_cards(selected_response_types, cards, request_body, hook_name)
218
- if selected_response_types.include?('companions_prerequisites')
219
- cards.append(create_companions_prerequisites_card(request_body['context']))
220
- end
217
+ def add_order_hook_cards(cards)
218
+ cards.append(create_companions_prerequisites_card) if selected_response_types.include?('companions_prerequisites')
221
219
 
222
220
  return unless selected_response_types.include?('propose_alternate_request')
223
221
 
224
- cards.append(create_alternate_request_card(request_body, hook_name))
222
+ cards.append(create_alternate_request_card)
225
223
  end
226
224
 
227
- def add_basic_cards(selected_response_types, cards, context)
228
- cards.append(create_form_completion_card(context)) if selected_response_types.include?('request_form_completion')
229
- cards.append(get_card_json('launch_smart_app.json')) if selected_response_types.include?('launch_smart_app')
230
- cards.append(get_card_json('external_reference.json')) if selected_response_types.include?('external_reference')
225
+ def add_basic_cards(cards)
226
+ cards.append(create_form_completion_card) if selected_response_types.include?('request_form_completion')
227
+ cards.append(load_json_file('launch_smart_app.json')) if selected_response_types.include?('launch_smart_app')
228
+ cards.append(load_json_file('external_reference.json')) if selected_response_types.include?('external_reference')
231
229
  end
232
230
 
233
- def add_coverage_cards(selected_response_types, cards, request_body, hook_name, update_resource_name,
234
- resource_type = nil)
235
- return unless add_coverage_cards?(selected_response_types, hook_name)
231
+ def add_coverage_cards(cards)
232
+ return unless add_coverage_cards?
236
233
 
237
- coverage = get_patient_coverage(request_body)
234
+ coverage = get_patient_coverage
238
235
  if coverage.present?
239
- if selected_response_types.include?('coverage_information') ||
240
- coverage_information_required_hooks.include?(hook_name)
241
- system_actions = create_coverage_extension_system_actions(request_body, update_resource_name,
242
- coverage.id, resource_type)
236
+ if selected_response_types.include?('coverage_information') || coverage_information_required?
237
+ system_actions =
238
+ create_coverage_extension_system_actions(coverage.id)
243
239
  end
244
240
 
245
241
  if selected_response_types.include?('create_update_coverage_info')
246
- cards.append(create_or_update_coverage(coverage, request_body['context']))
242
+ cards.append(create_or_update_coverage(coverage))
247
243
  end
248
244
  end
249
245
  system_actions
250
246
  end
251
247
 
252
- def create_coverage_extension_system_actions(request_body, update_resource_name, coverage_id, resource_type = nil)
253
- context = request_body['context']
254
- update_resource = context[update_resource_name]
255
- prefetch_id = update_resource_name.split(/(?=[A-Z])/).first
248
+ def create_coverage_extension_system_actions(coverage_id)
249
+ update_resource = context[resource_to_update_field_name]
250
+ prefetch_id = resource_to_update_field_name.split(/(?=[A-Z])/).first
251
+
252
+ fhir_resource =
253
+ if update_resource.is_a? Hash
254
+ FHIR.from_contents(update_resource.to_json)
255
+ elsif request_body['prefetch'] && request_body['prefetch'][prefetch_id]
256
+ FHIR.from_contents(request_body['prefetch'][prefetch_id].to_json)
257
+ else
258
+ get_context_resource(update_resource)
259
+ end
256
260
 
257
- fhir_resource = if update_resource.is_a? Hash
258
- FHIR.from_contents(update_resource.to_json)
259
- elsif request_body['prefetch'] && request_body['prefetch'][prefetch_id]
260
- FHIR.from_contents(request_body['prefetch'][prefetch_id].to_json)
261
- else
262
- get_context_resource(request_body, resource_type, update_resource)
263
- end
264
261
  create_system_actions(fhir_resource, coverage_id)
265
262
  rescue StandardError
266
263
  nil
@@ -274,16 +271,23 @@ module DaVinciCRDTestKit
274
271
  resource.entry.each do |entry|
275
272
  entry_resource = entry.resource
276
273
  add_coverage_extension(entry_resource, coverage_id)
277
- system_actions.append({ 'type' => 'update',
278
- 'description' =>
279
- "Added coverage information to #{entry_resource.resourceType} resource.",
280
- 'resource' => entry_resource })
274
+ system_actions.append(
275
+ {
276
+ 'type' => 'update',
277
+ 'description' => "Added coverage information to #{entry_resource.resourceType} resource.",
278
+ 'resource' => entry_resource
279
+ }
280
+ )
281
281
  end
282
282
  else
283
283
  add_coverage_extension(resource, coverage_id)
284
- system_actions.append({ 'type' => 'update',
285
- 'description' => "Added coverage information to #{resource.resourceType} resource.",
286
- 'resource' => resource })
284
+ system_actions.append(
285
+ {
286
+ 'type' => 'update',
287
+ 'description' => "Added coverage information to #{resource.resourceType} resource.",
288
+ 'resource' => resource
289
+ }
290
+ )
287
291
  end
288
292
  system_actions
289
293
  end
@@ -301,7 +305,11 @@ module DaVinciCRDTestKit
301
305
  ),
302
306
  FHIR::Extension.new(
303
307
  url: 'covered',
304
- valueCode: 'conditional'
308
+ valueCode: 'covered'
309
+ ),
310
+ FHIR::Extension.new(
311
+ url: 'pa-needed',
312
+ valueCode: 'no-auth'
305
313
  ),
306
314
  FHIR::Extension.new(
307
315
  url: 'date',
@@ -340,28 +348,31 @@ module DaVinciCRDTestKit
340
348
  )
341
349
  end
342
350
 
343
- def create_or_update_coverage(coverage, context)
351
+ def create_or_update_coverage(coverage)
344
352
  return if context.nil?
345
353
 
346
354
  if coverage.present?
347
355
  action = { 'type' => 'update', 'description' => 'Update current coverage record' }
348
- coverage.period = FHIR::Period.new(start: current_time.strftime('%Y-%m-%d'),
349
- end: (current_time + 1.month).strftime('%Y-%m-%d'))
356
+ coverage.period =
357
+ FHIR::Period.new(
358
+ start: current_time.strftime('%Y-%m-%d'),
359
+ end: (current_time + 1.month).strftime('%Y-%m-%d')
360
+ )
350
361
  action['resource'] = coverage
351
362
  else
352
363
  action = { 'type' => 'create', 'description' => 'Create coverage record' }
353
364
  new_coverage = create_coverage_resource(context['patientId'])
354
365
  action['resource'] = new_coverage
355
366
  end
356
- coverage_info_card = get_card_json('create_update_coverage_information.json')
367
+ coverage_info_card = load_json_file('create_update_coverage_information.json')
357
368
  coverage_info_card['suggestions'][0]['actions'] = [action]
358
369
  coverage_info_card
359
370
  end
360
371
 
361
- def create_form_completion_card(context)
372
+ def create_form_completion_card
362
373
  return if context.nil?
363
374
 
364
- request_form_completion_card = get_card_json('request_form_completion.json')
375
+ request_form_completion_card = load_json_file('request_form_completion.json')
365
376
  form_completion_task = request_form_completion_card['suggestions'][0]['actions'].find do |action|
366
377
  action['resource']['resourceType'] == 'Task'
367
378
  end['resource']
@@ -371,7 +382,7 @@ module DaVinciCRDTestKit
371
382
  request_form_completion_card
372
383
  end
373
384
 
374
- def update_service_request(service_request, context)
385
+ def update_service_request(service_request)
375
386
  return if context.nil?
376
387
 
377
388
  service_request['subject']['reference'] = "Patient/#{context['patientId']}"
@@ -379,23 +390,22 @@ module DaVinciCRDTestKit
379
390
  service_request['authoredOn'] = current_time.strftime('%Y-%m-%d')
380
391
  end
381
392
 
382
- def create_companions_prerequisites_card(context)
393
+ def create_companions_prerequisites_card
383
394
  return if context.nil?
384
395
 
385
- companions_prerequisites_card = get_card_json('companions_prerequisites.json')
396
+ companions_prerequisites_card = load_json_file('companions_prerequisites.json')
386
397
  card_service_request = companions_prerequisites_card['suggestions'][0]['actions'][0]['resource']
387
- update_service_request(card_service_request, context)
398
+ update_service_request(card_service_request)
388
399
  companions_prerequisites_card
389
400
  end
390
401
 
391
- def create_alternate_request_card(request_body, hook_name)
392
- context = request_body['context']
402
+ def create_alternate_request_card
393
403
  return if context.nil?
394
404
 
395
- propose_alternate_request_card = get_card_json('propose_alternate_request.json')
405
+ propose_alternate_request_card = load_json_file('propose_alternate_request.json')
396
406
 
397
407
  if hook_name == 'order-dispatch'
398
- order_resource = get_context_resource(request_body, nil, context['order'])
408
+ order_resource = get_context_resource(context['order'])
399
409
  else
400
410
  draft_orders = context['draftOrders']['entry']
401
411
  draft_order_resource = draft_orders[0]['resource']
@@ -407,14 +417,18 @@ module DaVinciCRDTestKit
407
417
  order_resource_id = order_resource.id
408
418
 
409
419
  card_actions = propose_alternate_request_card['suggestions'][0]['actions']
410
- card_actions.append(
420
+ card_actions.push(
411
421
  {
412
422
  'type' => 'delete',
413
423
  'description' => 'Remove current order until health assessment has been done',
414
424
  'resourceId' => ["#{order_resource_type}/#{order_resource_id}"]
425
+ },
426
+ {
427
+ 'type' => 'create',
428
+ 'description' => 'Order for patient health assessment',
429
+ 'resource' => order_resource
415
430
  }
416
431
  )
417
- update_service_request(card_actions[0]['resource'], context)
418
432
  propose_alternate_request_card
419
433
  end
420
434
  end
@@ -5,56 +5,45 @@ module DaVinciCRDTestKit
5
5
  include DaVinciCRDTestKit::MockServiceResponse
6
6
 
7
7
  def selected_response_types
8
- inputs = JSON.parse(result.input_json)
9
- selected_response_types_input = inputs.detect { |input| input['name'].include?('selected_response_types') }
10
- selected_response_types_input['value']
8
+ @selected_response_types ||=
9
+ JSON.parse(result.input_json)
10
+ .find { |input| input['name'].include?('selected_response_types') }
11
+ &.dig('value')
11
12
  end
12
13
 
13
- def test_run_identifier
14
- extract_iss_claim_and_hook(request)
14
+ def custom_response
15
+ @custom_response ||=
16
+ JSON.parse(result.input_json)
17
+ .find { |input| input['name'].include?('custom_response') }
18
+ &.dig('value')
15
19
  end
16
20
 
17
- def extract_iss_claim_and_hook(request)
18
- hook = extract_hook_name(request).to_s
19
- iss = extract_iss_claim_from_token(request).to_s
20
-
21
- "#{hook} #{iss}"
21
+ def test_run_identifier
22
+ "#{hook_name} #{iss}"
22
23
  end
23
24
 
24
- def extract_iss_claim_from_token(request)
25
- token = extract_bearer_token(request)
26
- begin
27
- payload, = JWT.decode(token, nil, false)
28
- payload['iss']
29
- rescue JWT::DecodeError
30
- nil
31
- end
25
+ def hook_name
26
+ @hook_name ||= request.params[:hook]
32
27
  end
33
28
 
34
- # Header expected to be a bearer token of the form "Bearer <token>"
35
- def extract_bearer_token(request)
36
- request.headers['authorization']&.delete_prefix('Bearer ')
29
+ def iss
30
+ @iss ||=
31
+ begin
32
+ payload, = JWT.decode(token, nil, false)
33
+ payload['iss']
34
+ rescue JWT::DecodeError
35
+ nil
36
+ end
37
37
  end
38
38
 
39
- def extract_hook_name(request)
40
- request.params[:hook]
39
+ def token
40
+ @token ||= request.headers['authorization']&.delete_prefix('Bearer ')
41
41
  end
42
42
 
43
43
  def make_response
44
- hook_name = extract_hook_name(request)
45
44
  case hook_name
46
- when 'appointment-book'
47
- appointment_book_response(selected_response_types)
48
- when 'encounter-start'
49
- encounter_start_response(selected_response_types)
50
- when 'encounter-discharge'
51
- encounter_discharge_response(selected_response_types)
52
- when 'order-select'
53
- order_select_response(selected_response_types)
54
- when 'order-sign'
55
- order_sign_response(selected_response_types)
56
- when 'order-dispatch'
57
- order_dispatch_response(selected_response_types)
45
+ when 'appointment-book', 'encounter-start', 'encounter-discharge', 'order-select', 'order-sign', 'order-dispatch'
46
+ hook_response
58
47
  else
59
48
  response.status = 400
60
49
  response.body = 'Invalid Request: Request did not contain a valid hook in the `hook` field.'
@@ -62,7 +51,6 @@ module DaVinciCRDTestKit
62
51
  end
63
52
 
64
53
  def tags
65
- hook_name = extract_hook_name(request)
66
54
  case hook_name
67
55
  when 'appointment-book'
68
56
  [APPOINTMENT_BOOK_TAG]
@@ -83,11 +71,7 @@ module DaVinciCRDTestKit
83
71
  end
84
72
 
85
73
  def name
86
- extract_hook_name(request).gsub('-', '_')
87
- end
88
-
89
- def update_result
90
- results_repo.update(result.id, result: 'pass')
74
+ hook_name.gsub('-', '_')
91
75
  end
92
76
  end
93
77
  end
@@ -24,6 +24,7 @@ module DaVinciCRDTestKit
24
24
  and the [CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
25
25
 
26
26
  This group includes tests to validate the following CRD response types:
27
+ - [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information) - optional
27
28
  - [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
28
29
  - optional
29
30
  - [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
@@ -118,6 +119,29 @@ module DaVinciCRDTestKit
118
119
  }
119
120
  }
120
121
  }
122
+ test from: :crd_coverage_info_system_action_received,
123
+ optional: true,
124
+ config: {
125
+ inputs: {
126
+ valid_system_actions: {
127
+ name: :encounter_discharge_valid_system_actions
128
+ }
129
+ },
130
+ outputs: {
131
+ coverage_info: {
132
+ name: :encounter_discharge_coverage_info
133
+ }
134
+ }
135
+ }
136
+ test from: :crd_coverage_info_system_action_validation,
137
+ optional: true,
138
+ config: {
139
+ inputs: {
140
+ coverage_info: {
141
+ name: :encounter_discharge_coverage_info
142
+ }
143
+ }
144
+ }
121
145
  test from: :crd_request_form_completion_response_validation,
122
146
  config: {
123
147
  inputs: {
@@ -24,6 +24,7 @@ module DaVinciCRDTestKit
24
24
  and the [CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
25
25
 
26
26
  This group includes tests to validate the following CRD response types:
27
+ - [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information) - optional
27
28
  - [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
28
29
  - optional
29
30
  - [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
@@ -118,6 +119,29 @@ module DaVinciCRDTestKit
118
119
  }
119
120
  }
120
121
  }
122
+ test from: :crd_coverage_info_system_action_received,
123
+ optional: true,
124
+ config: {
125
+ inputs: {
126
+ valid_system_actions: {
127
+ name: :encounter_start_valid_system_actions
128
+ }
129
+ },
130
+ outputs: {
131
+ coverage_info: {
132
+ name: :encounter_start_coverage_info
133
+ }
134
+ }
135
+ }
136
+ test from: :crd_coverage_info_system_action_validation,
137
+ optional: true,
138
+ config: {
139
+ inputs: {
140
+ coverage_info: {
141
+ name: :encounter_start_coverage_info
142
+ }
143
+ }
144
+ }
121
145
  test from: :crd_request_form_completion_response_validation,
122
146
  config: {
123
147
  inputs: {
@@ -28,6 +28,7 @@ module DaVinciCRDTestKit
28
28
  This group includes tests to validate the following CRD response types:
29
29
  - [additional orders as companions/prerequisites](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#identify-additional-orders-as-companionsprerequisites-for-current-order)\
30
30
  - optional
31
+ - [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information) - optional
31
32
  - [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
32
33
  - optional
33
34
  - [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
@@ -124,6 +125,29 @@ module DaVinciCRDTestKit
124
125
  }
125
126
  }
126
127
  }
128
+ test from: :crd_coverage_info_system_action_received,
129
+ optional: true,
130
+ config: {
131
+ inputs: {
132
+ valid_system_actions: {
133
+ name: :order_select_valid_system_actions
134
+ }
135
+ },
136
+ outputs: {
137
+ coverage_info: {
138
+ name: :order_select_coverage_info
139
+ }
140
+ }
141
+ }
142
+ test from: :crd_coverage_info_system_action_validation,
143
+ optional: true,
144
+ config: {
145
+ inputs: {
146
+ coverage_info: {
147
+ name: :order_select_coverage_info
148
+ }
149
+ }
150
+ }
127
151
  test from: :crd_propose_alternate_request_card_validation,
128
152
  config: {
129
153
  inputs: {