davinci_pdex_test_kit 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/pdex_payer_server_fhir_foundry_ri_preset.json +2 -2
  3. data/config/presets/pdex_payer_server_inferno_ri_preset.json +2 -2
  4. data/lib/davinci_pdex_test_kit/pdex_payer_client/client_member_match_tests/client_member_match_validation_test.rb +7 -5
  5. data/lib/davinci_pdex_test_kit/pdex_payer_client/client_workflow_interaction_test.rb +8 -7
  6. data/lib/davinci_pdex_test_kit/pdex_payer_client_suite.rb +8 -10
  7. data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_must_support_test.rb +50 -0
  8. data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_patient_search_test.rb +68 -0
  9. data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_patient_type_search_test.rb +54 -0
  10. data/lib/davinci_pdex_test_kit/pdex_payer_server/{explanation_of_benefit/explanation_of_benefit_provenance_revinclude_search_test.rb → device/device_provenance_revinclude_search_test.rb} +7 -7
  11. data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_read_test.rb +26 -0
  12. data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_reference_resolution_test.rb +42 -0
  13. data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_validation_test.rb +39 -0
  14. data/lib/davinci_pdex_test_kit/pdex_payer_server/device/metadata.yml +154 -0
  15. data/lib/davinci_pdex_test_kit/pdex_payer_server/device_group.rb +88 -0
  16. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_id_search_test.rb +7 -24
  17. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_identifier_search_test.rb +10 -24
  18. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_must_support_test.rb +37 -5
  19. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_lastupdated_search_test.rb +48 -0
  20. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_search_test.rb +62 -0
  21. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_service_date_search_test.rb +7 -23
  22. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_type_search_test.rb +6 -23
  23. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_reference_resolution_test.rb +7 -4
  24. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_validation_test.rb +9 -10
  25. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/metadata.yml +276 -264
  26. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit_group.rb +62 -64
  27. data/lib/davinci_pdex_test_kit/pdex_payer_server/export_patient_group.rb +8 -9
  28. data/lib/davinci_pdex_test_kit/pdex_payer_server/export_validation_group.rb +1 -2
  29. data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_must_support_test.rb +42 -0
  30. data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_patient_search_test.rb +64 -0
  31. data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_patient_status_search_test.rb +54 -0
  32. data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_patient_status_type_search_test.rb +55 -0
  33. data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_provenance_revinclude_search_test.rb +54 -0
  34. data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_read_test.rb +26 -0
  35. data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_reference_resolution_test.rb +42 -0
  36. data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_validation_test.rb +39 -0
  37. data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/metadata.yml +206 -0
  38. data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense_group.rb +69 -0
  39. data/lib/davinci_pdex_test_kit/pdex_payer_server/multiple_member_matches_group.rb +36 -36
  40. data/lib/davinci_pdex_test_kit/pdex_payer_server/no_member_matches_group.rb +30 -30
  41. data/lib/davinci_pdex_test_kit/pdex_payer_server/patient_operation_in_capability_statement_validation.rb +15 -13
  42. data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance/metadata.yml +173 -0
  43. data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_must_support_test.rb +51 -0
  44. data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_read_test.rb +26 -0
  45. data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_reference_resolution_test.rb +46 -0
  46. data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_validation_test.rb +39 -0
  47. data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance_group.rb +59 -0
  48. data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_clinical_data_group.rb +22 -11
  49. data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_everything_group.rb +19 -6
  50. data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_export_group.rb +22 -16
  51. data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_member_match_group.rb +44 -25
  52. data/lib/davinci_pdex_test_kit/pdex_payer_server_suite.rb +123 -110
  53. data/lib/davinci_pdex_test_kit/pdex_provider_client_suite.rb +8 -8
  54. data/lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_out_of_scope_requirements.csv +1 -0
  55. data/lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_requirements.csv +64 -0
  56. data/lib/davinci_pdex_test_kit/requirements/generated/davinci-pdex-test-kit_requirements_coverage.csv +64 -0
  57. data/lib/davinci_pdex_test_kit/version.rb +2 -2
  58. data/lib/davinci_pdex_test_kit.rb +1 -0
  59. data/lib/inferno_requirements_tools/ext/inferno_core/runnable.rb +22 -0
  60. data/lib/inferno_requirements_tools/rake/rakefile_template +19 -0
  61. data/lib/inferno_requirements_tools/tasks/requirements_coverage.rb +284 -0
  62. data/lib/requirements_config.yaml +17 -0
  63. metadata +56 -11
  64. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_last_updated_search_test.rb +0 -64
  65. data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_use_search_test.rb +0 -69
@@ -0,0 +1,284 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+ require 'yaml'
5
+ require_relative '../ext/inferno_core/runnable'
6
+
7
+ module InfernoRequirementsTools
8
+ module Tasks
9
+ # This class manages the mapping of test kit tests to requirements that they verify
10
+ # and creates a CSV file with the tests that cover each requirement.
11
+ # It expects a CSV file in the repo at `lib/[test kit id]/requirements/[test kit id]_requirements.csv`
12
+ # that serves as the source of the requirement set for the test kit. The requirements in
13
+ # this files are identified by a requirement set and an id and tests, groups, and suites
14
+ # within in the test kit can claim that they verify a requirement by including a reference
15
+ # to that requirementin the form <requirement set>@<id> in their `verifies_requirements` field.
16
+ # Requirements that are out of scope can be listed in a companion file
17
+ # `lib/[test kit id]/requirements/[test kit id]_out_of_scope_requirements.csv`.
18
+ #
19
+ # The `run` method generates a CSV file at
20
+ # `lib/[test kit id]/requirements/generated/[test kit id]_requirements_coverage.csv``.
21
+ # This file will be identical to the input spreadsheet, plus an additional column which holds a comma separated
22
+ # list of inferno test IDs that test each requirement. These test IDs are Inferno short form IDs that represent the
23
+ # position of the test within its group and suite. For example, the fifth test in the second group will have an ID
24
+ # of 2.05. This ID is also shown in the Inferno web UI.
25
+ #
26
+ # The `run_check` method will check whether the previously generated file is up-to-date.
27
+ class RequirementsCoverage
28
+ VERSION = '0.2.0' # update when making meaningful changes to this method for tracking used versions
29
+ CONFIG = YAML.load_file(File.join('lib', 'requirements_config.yaml'))
30
+
31
+ TEST_KIT_ID = CONFIG['test_kit_id']
32
+ TEST_SUITES = CONFIG['suites'].map do |test_suite|
33
+ Object.const_get(test_suite['class_name'])
34
+ end
35
+
36
+ SUITE_ID_TO_ACTOR_MAP = CONFIG['suites'].each_with_object({}) do |test_suite, hash|
37
+ hash[test_suite['id']] = test_suite['suite_actor']
38
+ end
39
+
40
+ # Derivative constants
41
+ TEST_KIT_CODE_FOLDER = TEST_KIT_ID
42
+ DASHERIZED_TEST_KIT_ID = TEST_KIT_ID.gsub('_', '-')
43
+ INPUT_HEADERS = [
44
+ 'Req Set',
45
+ 'ID',
46
+ 'URL',
47
+ 'Requirement',
48
+ 'Conformance',
49
+ 'Actor',
50
+ 'Sub-Requirement(s)',
51
+ 'Conditionality'
52
+ ].freeze
53
+ SHORT_ID_HEADER = 'Short ID(s)'
54
+ FULL_ID_HEADER = 'Full ID(s)'
55
+ INPUT_FILE_NAME = "#{DASHERIZED_TEST_KIT_ID}_requirements.csv".freeze
56
+ INPUT_FILE = File.join('lib', TEST_KIT_CODE_FOLDER, 'requirements', INPUT_FILE_NAME).freeze
57
+ NOT_TESTED_FILE_NAME = "#{DASHERIZED_TEST_KIT_ID}_out_of_scope_requirements.csv".freeze
58
+ NOT_TESTED_FILE = File.join('lib', TEST_KIT_CODE_FOLDER, 'requirements', NOT_TESTED_FILE_NAME).freeze
59
+ OUTPUT_HEADERS = INPUT_HEADERS + TEST_SUITES.flat_map do |suite|
60
+ ["#{suite.title} #{SHORT_ID_HEADER}", "#{suite.title} #{FULL_ID_HEADER}"]
61
+ end
62
+ OUTPUT_FILE_NAME = "#{DASHERIZED_TEST_KIT_ID}_requirements_coverage.csv".freeze
63
+ OUTPUT_FILE_DIRECTORY = File.join('lib', TEST_KIT_CODE_FOLDER, 'requirements', 'generated')
64
+ OUTPUT_FILE = File.join(OUTPUT_FILE_DIRECTORY, OUTPUT_FILE_NAME).freeze
65
+
66
+ def input_rows
67
+ @input_rows ||=
68
+ CSV.parse(File.open(INPUT_FILE, 'r:bom|utf-8'), headers: true).map do |row|
69
+ row.to_h.slice(*INPUT_HEADERS)
70
+ end
71
+ end
72
+
73
+ def not_tested_requirements_map
74
+ @not_tested_requirements_map ||= load_not_tested_requirements
75
+ end
76
+
77
+ def load_not_tested_requirements
78
+ return {} unless File.exist?(NOT_TESTED_FILE)
79
+
80
+ not_tested_requirements = {}
81
+ CSV.parse(File.open(NOT_TESTED_FILE, 'r:bom|utf-8'), headers: true).each do |row|
82
+ row_hash = row.to_h
83
+ not_tested_requirements["#{row_hash['Req Set']}@#{row_hash['ID']}"] = row_hash
84
+ end
85
+
86
+ not_tested_requirements
87
+ end
88
+
89
+ # Of the form:
90
+ # {
91
+ # 'req-id-1': [
92
+ # { short_id: 'short-id-1', full_id: 'long-id-1', suite_id: 'suite-id-1' },
93
+ # { short_id: 'short-id-2', full_id: 'long-id-2', suite_id: 'suite-id-2' }
94
+ # ],
95
+ # 'req-id-2': [{ short_id: 'short-id-3', full_id: 'long-id-3', suite_id: 'suite-id-3' }],
96
+ # ...
97
+ # }
98
+ def inferno_requirements_map
99
+ @inferno_requirements_map ||= TEST_SUITES.each_with_object({}) do |suite, requirements_map|
100
+ serialize_requirements(suite, 'suite', suite.id, requirements_map)
101
+ suite.groups.each do |group|
102
+ map_group_requirements(group, suite.id, requirements_map)
103
+ end
104
+ end
105
+ end
106
+
107
+ def new_csv
108
+ @new_csv ||=
109
+ CSV.generate(+"\xEF\xBB\xBF") do |csv|
110
+ csv << OUTPUT_HEADERS
111
+ input_rows.each do |row| # NOTE: use row order from source file
112
+ next if row['Conformance'] == 'DEPRECATED' # filter out deprecated rows
113
+
114
+ TEST_SUITES.each do |suite|
115
+ suite_actor = SUITE_ID_TO_ACTOR_MAP[suite.id]
116
+ if row['Actor']&.include?(suite_actor)
117
+ add_suite_tests_for_row(row, suite)
118
+ else
119
+ row["#{suite.title} #{SHORT_ID_HEADER}"] = 'NA'
120
+ row["#{suite.title} #{FULL_ID_HEADER}"] = 'NA'
121
+ end
122
+ end
123
+ csv << row.values
124
+ end
125
+ end
126
+ end
127
+
128
+ def add_suite_tests_for_row(row, suite)
129
+ set_and_req_id = "#{row['Req Set']}@#{row['ID']}"
130
+ items = get_items_for_requirement(set_and_req_id, suite)
131
+ short_ids = items[0]
132
+ full_ids = items[1]
133
+ if short_ids.blank? && not_tested_requirements_map.key?(set_and_req_id)
134
+ row["#{suite.title} #{SHORT_ID_HEADER}"] = 'Not Tested'
135
+ row["#{suite.title} #{FULL_ID_HEADER}"] = 'Not Tested'
136
+ else
137
+ row["#{suite.title} #{SHORT_ID_HEADER}"] = short_ids&.join(', ')
138
+ row["#{suite.title} #{FULL_ID_HEADER}"] = full_ids&.join(', ')
139
+ end
140
+ end
141
+
142
+ def get_items_for_requirement(set_and_req_id, suite)
143
+ suite_requirement_items = inferno_requirements_map[set_and_req_id]&.filter do |item|
144
+ item[:suite_id] == suite.id
145
+ end
146
+ [
147
+ suite_requirement_items&.map { |item| item[:short_id] },
148
+ suite_requirement_items&.map { |item| item[:full_id] }
149
+ ]
150
+ end
151
+
152
+ def input_requirement_ids
153
+ @input_requirement_ids ||= input_rows.map { |row| "#{row['Req Set']}@#{row['ID']}" }
154
+ end
155
+
156
+ # The requirements present in Inferno that aren't in the input spreadsheet
157
+ def unmatched_requirements_map
158
+ @unmatched_requirements_map ||= inferno_requirements_map.except(*input_requirement_ids)
159
+ end
160
+
161
+ def old_csv
162
+ @old_csv ||= File.read(OUTPUT_FILE)
163
+ end
164
+
165
+ def run
166
+ unless File.exist?(INPUT_FILE)
167
+ puts "Could not find input file: #{INPUT_FILE}. Aborting requirements coverage generation..."
168
+ exit(1)
169
+ end
170
+
171
+ if unmatched_requirements_map.any?
172
+ puts "WARNING: The following requirements indicated in the test kit are not present in #{INPUT_FILE_NAME}"
173
+ output_requirements_map_table(unmatched_requirements_map)
174
+ end
175
+
176
+ if File.exist?(OUTPUT_FILE)
177
+ if old_csv == new_csv
178
+ puts "'#{OUTPUT_FILE_NAME}' file is up to date."
179
+ return
180
+ else
181
+ puts 'Requirements coverage has changed.'
182
+ end
183
+ else
184
+ puts "No existing #{OUTPUT_FILE_NAME}."
185
+ end
186
+
187
+ puts "Writing to file #{OUTPUT_FILE}..."
188
+ FileUtils.mkdir_p(OUTPUT_FILE_DIRECTORY)
189
+ File.write(OUTPUT_FILE, new_csv)
190
+ puts 'Done.'
191
+ end
192
+
193
+ def run_check
194
+ unless File.exist?(INPUT_FILE)
195
+ puts "Could not find input file: #{INPUT_FILE}. Aborting requirements coverage check..."
196
+ exit(1)
197
+ end
198
+
199
+ if unmatched_requirements_map.any?
200
+ puts "The following requirements indicated in the test kit are not present in #{INPUT_FILE_NAME}"
201
+ output_requirements_map_table(unmatched_requirements_map)
202
+ end
203
+
204
+ if File.exist?(OUTPUT_FILE)
205
+ if old_csv == new_csv
206
+ puts "'#{OUTPUT_FILE_NAME}' file is up to date."
207
+ return unless unmatched_requirements_map.any?
208
+ else
209
+ puts <<~MESSAGE
210
+ #{OUTPUT_FILE_NAME} file is out of date.
211
+ To regenerate the file, run:
212
+
213
+ bundle exec rake requirements:generate_coverage
214
+
215
+ MESSAGE
216
+ end
217
+ else
218
+ puts <<~MESSAGE
219
+ No existing #{OUTPUT_FILE_NAME} file.
220
+ To generate the file, run:
221
+
222
+ bundle exec rake requirements:generate_coverage
223
+
224
+ MESSAGE
225
+ end
226
+
227
+ puts 'Check failed.'
228
+ exit(1)
229
+ end
230
+
231
+ def map_group_requirements(group, suite_id, requirements_map)
232
+ serialize_requirements(group, group.short_id, suite_id, requirements_map)
233
+ group.tests&.each { |test| serialize_requirements(test, test.short_id, suite_id, requirements_map) }
234
+ group.groups&.each { |subgroup| map_group_requirements(subgroup, suite_id, requirements_map) }
235
+ end
236
+
237
+ def serialize_requirements(runnable, short_id, suite_id, requirements_map)
238
+ runnable.verifies_requirements&.each do |requirement_id|
239
+ requirement_id_string = requirement_id.to_s
240
+
241
+ requirements_map[requirement_id_string] ||= []
242
+ requirements_map[requirement_id_string] << { short_id:, full_id: runnable.id, suite_id: }
243
+ end
244
+ end
245
+
246
+ # Output the requirements in the map like so:
247
+ #
248
+ # requirement_id | short_id | full_id
249
+ # ---------------+------------+----------
250
+ # req-id-1 | short-id-1 | full-id-1
251
+ # req-id-2 | short-id-2 | full-id-2
252
+ #
253
+ def output_requirements_map_table(requirements_map)
254
+ headers = %w[requirement_id short_id full_id]
255
+ col_widths = headers.map(&:length)
256
+ col_widths[0] = [col_widths[0], requirements_map.keys.map(&:length).max].max
257
+ col_widths[1] = ([col_widths[1]] + requirements_map.values.flatten.map { |item| item[:short_id].length }).max
258
+ col_widths[2] = ([col_widths[2]] + requirements_map.values.flatten.map { |item| item[:full_id].length }).max
259
+ col_widths.map { |width| width + 3 }
260
+
261
+ puts [
262
+ headers[0].ljust(col_widths[0]),
263
+ headers[1].ljust(col_widths[1]),
264
+ headers[2].ljust(col_widths[2])
265
+ ].join(' | ')
266
+ puts col_widths.map { |width| '-' * width }.join('-+-')
267
+ output_requirements_map_table_contents(requirements_map, col_widths)
268
+ puts
269
+ end
270
+
271
+ def output_requirements_map_table_contents(requirements_map, col_widths)
272
+ requirements_map.each do |requirement_id, runnables|
273
+ runnables.each do |runnable|
274
+ puts [
275
+ requirement_id.ljust(col_widths[0]),
276
+ runnable[:short_id].ljust(col_widths[1]),
277
+ runnable[:full_id].ljust(col_widths[2])
278
+ ].join(' | ')
279
+ end
280
+ end
281
+ end
282
+ end
283
+ end
284
+ end
@@ -0,0 +1,17 @@
1
+ test_kit_id: davinci_pdex_test_kit
2
+
3
+ suites:
4
+ - id: pdex_payer_server
5
+ class_name: DaVinciPDexTestKit::PDexPayerServerSuite
6
+ suite_actor: Server
7
+ - id: pdex_payer_client
8
+ class_name: DaVinciPDexTestKit::PDexPayerClientSuite
9
+ suite_actor: Client
10
+
11
+ requirement_sets:
12
+ - id: hl7.fhir.us.davinci-pdex_2.0.0
13
+ folder: PDex
14
+ requirements: All
15
+ actor_map:
16
+ - {spec: Server, test_kit: Server}
17
+ - {spec: Client, test_kit: Client}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: davinci_pdex_test_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karl Naden
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2025-02-25 00:00:00.000000000 Z
13
+ date: 2025-04-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: inferno_core
@@ -18,42 +18,42 @@ dependencies:
18
18
  requirements:
19
19
  - - "~>"
20
20
  - !ruby/object:Gem::Version
21
- version: 0.6.2
21
+ version: 0.6.7
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
- version: 0.6.2
28
+ version: 0.6.7
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: us_core_test_kit
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: 0.10.1
35
+ version: 0.11.0
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: 0.10.1
42
+ version: 0.11.0
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: bulk_data_test_kit
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: 0.11.0
49
+ version: 0.12.1
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
- version: 0.11.0
56
+ version: 0.12.1
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: faraday
59
59
  requirement: !ruby/object:Gem::Requirement
@@ -152,6 +152,20 @@ dependencies:
152
152
  - - "~>"
153
153
  - !ruby/object:Gem::Version
154
154
  version: '3.4'
155
+ - !ruby/object:Gem::Dependency
156
+ name: roo
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: 2.10.1
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: 2.10.1
155
169
  description: Test Kit for the Da Vinci Payer Data Exchange (PDex) FHIR Implementation
156
170
  Guide
157
171
  email:
@@ -219,14 +233,22 @@ files:
219
233
  - lib/davinci_pdex_test_kit/pdex_payer_client_suite.rb
220
234
  - lib/davinci_pdex_test_kit/pdex_payer_server/coverage_to_link_minimal_data_validation.rb
221
235
  - lib/davinci_pdex_test_kit/pdex_payer_server/coverage_to_link_must_support_validation.rb
236
+ - lib/davinci_pdex_test_kit/pdex_payer_server/device/device_must_support_test.rb
237
+ - lib/davinci_pdex_test_kit/pdex_payer_server/device/device_patient_search_test.rb
238
+ - lib/davinci_pdex_test_kit/pdex_payer_server/device/device_patient_type_search_test.rb
239
+ - lib/davinci_pdex_test_kit/pdex_payer_server/device/device_provenance_revinclude_search_test.rb
240
+ - lib/davinci_pdex_test_kit/pdex_payer_server/device/device_read_test.rb
241
+ - lib/davinci_pdex_test_kit/pdex_payer_server/device/device_reference_resolution_test.rb
242
+ - lib/davinci_pdex_test_kit/pdex_payer_server/device/device_validation_test.rb
243
+ - lib/davinci_pdex_test_kit/pdex_payer_server/device/metadata.yml
244
+ - lib/davinci_pdex_test_kit/pdex_payer_server/device_group.rb
222
245
  - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_id_search_test.rb
223
246
  - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_identifier_search_test.rb
224
247
  - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_must_support_test.rb
225
- - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_last_updated_search_test.rb
248
+ - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_lastupdated_search_test.rb
249
+ - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_search_test.rb
226
250
  - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_service_date_search_test.rb
227
251
  - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_type_search_test.rb
228
- - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_use_search_test.rb
229
- - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_provenance_revinclude_search_test.rb
230
252
  - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_read_test.rb
231
253
  - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_reference_resolution_test.rb
232
254
  - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_validation_test.rb
@@ -234,19 +256,42 @@ files:
234
256
  - lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit_group.rb
235
257
  - lib/davinci_pdex_test_kit/pdex_payer_server/export_patient_group.rb
236
258
  - lib/davinci_pdex_test_kit/pdex_payer_server/export_validation_group.rb
259
+ - lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_must_support_test.rb
260
+ - lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_patient_search_test.rb
261
+ - lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_patient_status_search_test.rb
262
+ - lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_patient_status_type_search_test.rb
263
+ - lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_provenance_revinclude_search_test.rb
264
+ - lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_read_test.rb
265
+ - lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_reference_resolution_test.rb
266
+ - lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_validation_test.rb
267
+ - lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/metadata.yml
268
+ - lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense_group.rb
237
269
  - lib/davinci_pdex_test_kit/pdex_payer_server/member_match_request_local_references_validation.rb
238
270
  - lib/davinci_pdex_test_kit/pdex_payer_server/member_match_request_profile_validation.rb
239
271
  - lib/davinci_pdex_test_kit/pdex_payer_server/multiple_member_matches_group.rb
240
272
  - lib/davinci_pdex_test_kit/pdex_payer_server/no_member_matches_group.rb
241
273
  - lib/davinci_pdex_test_kit/pdex_payer_server/patient_operation_in_capability_statement_validation.rb
274
+ - lib/davinci_pdex_test_kit/pdex_payer_server/provenance/metadata.yml
275
+ - lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_must_support_test.rb
276
+ - lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_read_test.rb
277
+ - lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_reference_resolution_test.rb
278
+ - lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_validation_test.rb
279
+ - lib/davinci_pdex_test_kit/pdex_payer_server/provenance_group.rb
242
280
  - lib/davinci_pdex_test_kit/pdex_payer_server/workflow_clinical_data_group.rb
243
281
  - lib/davinci_pdex_test_kit/pdex_payer_server/workflow_everything_group.rb
244
282
  - lib/davinci_pdex_test_kit/pdex_payer_server/workflow_export_group.rb
245
283
  - lib/davinci_pdex_test_kit/pdex_payer_server/workflow_member_match_group.rb
246
284
  - lib/davinci_pdex_test_kit/pdex_payer_server_suite.rb
247
285
  - lib/davinci_pdex_test_kit/pdex_provider_client_suite.rb
286
+ - lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_out_of_scope_requirements.csv
287
+ - lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_requirements.csv
288
+ - lib/davinci_pdex_test_kit/requirements/generated/davinci-pdex-test-kit_requirements_coverage.csv
248
289
  - lib/davinci_pdex_test_kit/user_input_response.rb
249
290
  - lib/davinci_pdex_test_kit/version.rb
291
+ - lib/inferno_requirements_tools/ext/inferno_core/runnable.rb
292
+ - lib/inferno_requirements_tools/rake/rakefile_template
293
+ - lib/inferno_requirements_tools/tasks/requirements_coverage.rb
294
+ - lib/requirements_config.yaml
250
295
  homepage: https://github.com/inferno-framework/davinci-pdex-test-kit/
251
296
  licenses:
252
297
  - Apache-2.0
@@ -1,64 +0,0 @@
1
- require 'us_core_test_kit/search_test'
2
- require 'us_core_test_kit/search_test_properties'
3
- require 'us_core_test_kit/generator/group_metadata'
4
-
5
- module DaVinciPDexTestKit
6
- module PDexPayerServer
7
- class ExplanationOfBenefitPatientLastUpdatedSearchTest < Inferno::Test
8
- include USCoreTestKit::SearchTest
9
-
10
- title 'Server returns valid results for ExplanationOfBenefit search by patient + _lastUpdated'
11
- description %(
12
- A server SHALL support searching by
13
- patient + _lastUpdated on the ExplanationOfBenefit resource. This test
14
- will pass if resources are returned and match the search criteria. If
15
- none are returned, the test is skipped.
16
-
17
- This test verifies that the server supports searching by reference using
18
- the form `patient=[id]` as well as `patient=Patient/[id]`. The two
19
- different forms are expected to return the same number of results. US
20
- Core requires that both forms are supported by US Core responders, and
21
- PDex expands upon US Core.
22
-
23
- Because this is the first search of the sequence, resources in the
24
- response will be used for subsequent tests.
25
-
26
- Additionally, this test will check that GET and POST search methods
27
- return the same number of results. Search by POST is required by the
28
- FHIR R4 specification, and these tests interpret search by GET as a
29
- requirement of PDex v2.0.0.
30
-
31
- [PDex Server CapabilityStatement](https://hl7.org/fhir/us/davinci-pdex/STU2/CapabilityStatement-pdex-server.html)
32
-
33
- )
34
-
35
- id :pdex_eob_patient_last_updated_search
36
-
37
- input :patient_ids,
38
- title: 'Patient IDs',
39
- description: 'Comma separated list of patient IDs that in sum contain all MUST SUPPORT elements'
40
-
41
- def self.properties
42
- @properties ||= USCoreTestKit::SearchTestProperties.new(
43
- resource_type: 'ExplanationOfBenefit',
44
- search_param_names: ['patient', '_lastUpdated'],
45
- test_post_search: true
46
- # TODO: other properties?
47
- )
48
- end
49
-
50
- def self.metadata
51
- @metadata ||= USCoreTestKit::Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'metadata.yml'),
52
- aliases: true))
53
- end
54
-
55
- def scratch_resources
56
- scratch[:explanation_of_benefit_resources] ||= {}
57
- end
58
-
59
- run do
60
- run_search_test
61
- end
62
- end
63
- end
64
- end
@@ -1,69 +0,0 @@
1
- require 'us_core_test_kit/search_test'
2
- require 'us_core_test_kit/search_test_properties'
3
- require 'us_core_test_kit/generator/group_metadata'
4
-
5
- module DaVinciPDexTestKit
6
- module PDexPayerServer
7
- class ExplanationOfBenefitPatientUseSearchTest < Inferno::Test
8
- include USCoreTestKit::SearchTest
9
-
10
- title 'Server returns valid results for ExplanationOfBenefit search by patient + use'
11
- description %(
12
- A server SHALL support searching by
13
- patient + use on the ExplanationOfBenefit resource. This test
14
- will pass if resources are returned and match the search criteria. If
15
- none are returned, the test is skipped.
16
-
17
- This test verifies that the server supports searching by reference using
18
- the form `patient=[id]` as well as `patient=Patient/[id]`. The two
19
- different forms are expected to return the same number of results. US
20
- Core requires that both forms are supported by US Core responders, and
21
- PDex expands upon US Core.
22
-
23
- Because this is the first search of the sequence, resources in the
24
- response will be used for subsequent tests.
25
-
26
- Additionally, this test will check that GET and POST search methods
27
- return the same number of results. Search by POST is required by the
28
- FHIR R4 specification, and these tests interpret search by GET as a
29
- requirement of PDex v2.0.0.
30
-
31
- [PDex Server CapabilityStatement](https://hl7.org/fhir/us/davinci-pdex/STU2/CapabilityStatement-pdex-server.html)
32
-
33
- )
34
-
35
- id :pdex_eob_patient_use_search
36
-
37
- input :patient_ids,
38
- title: 'Patient IDs',
39
- description: 'Comma separated list of patient IDs that in sum contain all MUST SUPPORT elements'
40
-
41
- def self.properties
42
- @properties ||= USCoreTestKit::SearchTestProperties.new(
43
- first_search: true,
44
- fixed_value_search: true,
45
- resource_type: 'ExplanationOfBenefit',
46
- search_param_names: ['patient', 'use'],
47
- saves_delayed_references: true,
48
- possible_status_search: true,
49
- token_search_params: ['use'],
50
- test_reference_variants: true,
51
- test_post_search: true
52
- )
53
- end
54
-
55
- def self.metadata
56
- @metadata ||= USCoreTestKit::Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'metadata.yml'),
57
- aliases: true))
58
- end
59
-
60
- def scratch_resources
61
- scratch[:explanation_of_benefit_resources] ||= {}
62
- end
63
-
64
- run do
65
- run_search_test
66
- end
67
- end
68
- end
69
- end