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.
- checksums.yaml +4 -4
- data/config/presets/pdex_payer_server_fhir_foundry_ri_preset.json +2 -2
- data/config/presets/pdex_payer_server_inferno_ri_preset.json +2 -2
- data/lib/davinci_pdex_test_kit/pdex_payer_client/client_member_match_tests/client_member_match_validation_test.rb +7 -5
- data/lib/davinci_pdex_test_kit/pdex_payer_client/client_workflow_interaction_test.rb +8 -7
- data/lib/davinci_pdex_test_kit/pdex_payer_client_suite.rb +8 -10
- data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_must_support_test.rb +50 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_patient_search_test.rb +68 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_patient_type_search_test.rb +54 -0
- 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
- data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_read_test.rb +26 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_reference_resolution_test.rb +42 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/device/device_validation_test.rb +39 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/device/metadata.yml +154 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/device_group.rb +88 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_id_search_test.rb +7 -24
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_identifier_search_test.rb +10 -24
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_must_support_test.rb +37 -5
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_lastupdated_search_test.rb +48 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_search_test.rb +62 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_service_date_search_test.rb +7 -23
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_type_search_test.rb +6 -23
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_reference_resolution_test.rb +7 -4
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_validation_test.rb +9 -10
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/metadata.yml +276 -264
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit_group.rb +62 -64
- data/lib/davinci_pdex_test_kit/pdex_payer_server/export_patient_group.rb +8 -9
- data/lib/davinci_pdex_test_kit/pdex_payer_server/export_validation_group.rb +1 -2
- data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_must_support_test.rb +42 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_patient_search_test.rb +64 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_patient_status_search_test.rb +54 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_patient_status_type_search_test.rb +55 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_provenance_revinclude_search_test.rb +54 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_read_test.rb +26 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_reference_resolution_test.rb +42 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/medication_dispense_validation_test.rb +39 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense/metadata.yml +206 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/medication_dispense_group.rb +69 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/multiple_member_matches_group.rb +36 -36
- data/lib/davinci_pdex_test_kit/pdex_payer_server/no_member_matches_group.rb +30 -30
- data/lib/davinci_pdex_test_kit/pdex_payer_server/patient_operation_in_capability_statement_validation.rb +15 -13
- data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance/metadata.yml +173 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_must_support_test.rb +51 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_read_test.rb +26 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_reference_resolution_test.rb +46 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance/provenance_validation_test.rb +39 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/provenance_group.rb +59 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_clinical_data_group.rb +22 -11
- data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_everything_group.rb +19 -6
- data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_export_group.rb +22 -16
- data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_member_match_group.rb +44 -25
- data/lib/davinci_pdex_test_kit/pdex_payer_server_suite.rb +123 -110
- data/lib/davinci_pdex_test_kit/pdex_provider_client_suite.rb +8 -8
- data/lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_out_of_scope_requirements.csv +1 -0
- data/lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_requirements.csv +64 -0
- data/lib/davinci_pdex_test_kit/requirements/generated/davinci-pdex-test-kit_requirements_coverage.csv +64 -0
- data/lib/davinci_pdex_test_kit/version.rb +2 -2
- data/lib/davinci_pdex_test_kit.rb +1 -0
- data/lib/inferno_requirements_tools/ext/inferno_core/runnable.rb +22 -0
- data/lib/inferno_requirements_tools/rake/rakefile_template +19 -0
- data/lib/inferno_requirements_tools/tasks/requirements_coverage.rb +284 -0
- data/lib/requirements_config.yaml +17 -0
- metadata +56 -11
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_last_updated_search_test.rb +0 -64
- 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.
|
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-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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/
|
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
|