Class: DaVinciUSDrugFormularyTestKit::Generator::SearchTestGenerator
- Inherits:
-
Object
- Object
- DaVinciUSDrugFormularyTestKit::Generator::SearchTestGenerator
show all
- Defined in:
- lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(group_metadata, search_metadata, base_output_dir) ⇒ SearchTestGenerator
Returns a new instance of SearchTestGenerator.
17
18
19
20
21
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 17
def initialize(group_metadata, search_metadata, base_output_dir)
self.group_metadata = group_metadata
self.search_metadata = search_metadata
self.base_output_dir = base_output_dir
end
|
Instance Attribute Details
#base_output_dir ⇒ Object
Returns the value of attribute base_output_dir.
15
16
17
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 15
def base_output_dir
@base_output_dir
end
|
Returns the value of attribute group_metadata.
15
16
17
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 15
def group_metadata
@group_metadata
end
|
Returns the value of attribute search_metadata.
15
16
17
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 15
def search_metadata
@search_metadata
end
|
Class Method Details
.generate(ig_metadata, base_output_dir) ⇒ Object
6
7
8
9
10
11
12
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 6
def generate(ig_metadata, base_output_dir)
ig_metadata.groups
.select { |group| group.searches.present? }
.each do |group|
group.searches.each { |search| new(group, search, base_output_dir).generate }
end
end
|
Instance Method Details
#array_of_strings(array) ⇒ Object
171
172
173
174
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 171
def array_of_strings(array)
quoted_strings = array.map { |element| "'#{element}'" }
"[#{quoted_strings.join(', ')}]"
end
|
#base_output_file_name ⇒ Object
31
32
33
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 31
def base_output_file_name
"#{class_name.underscore}.rb"
end
|
#class_name ⇒ Object
59
60
61
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 59
def class_name
"#{Naming.upper_camel_case_for_profile(group_metadata)}#{search_title}SearchTest"
end
|
71
72
73
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 71
def conformance_expectation
search_metadata[:expectation]
end
|
#description ⇒ Object
255
256
257
258
259
260
261
262
263
264
265
266
267
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 255
def description
<<~DESCRIPTION.gsub(/\n{3,}/, "\n\n")
A server #{conformance_expectation} support searching by
#{search_param_name_string} on the #{resource_type} resource. This test
will pass if resources are returned and match the search criteria. If
none are returned, the test is skipped.
#{first_search_description}
#{post_search_description}
[US Drug Formulary](http://hl7.org/fhir/us/davinci-drug-formulary/#{url_version}/CapabilityStatement-usdf-server.html)
DESCRIPTION
end
|
#first_search? ⇒ Boolean
85
86
87
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 85
def first_search?
group_metadata.searches.first == search_metadata
end
|
#first_search_description ⇒ Object
235
236
237
238
239
240
241
242
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 235
def first_search_description
return '' unless first_search?
<<~FIRST_SEARCH_DESCRIPTION
Because this is the first search of the sequence, resources in the
response will be used for subsequent tests.
FIRST_SEARCH_DESCRIPTION
end
|
#fixed_value_search? ⇒ Boolean
89
90
91
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 89
def fixed_value_search?
first_search? && (search_metadata[:names] == ['status'] || search_metadata[:names] == ['code'])
end
|
#fixed_value_search_param_name ⇒ Object
93
94
95
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 93
def fixed_value_search_param_name
(search_metadata[:names] - [:patient]).first
end
|
#generate ⇒ Object
214
215
216
217
218
219
220
221
222
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 214
def generate
FileUtils.mkdir_p(output_file_directory)
File.write(output_file_name, output)
group_metadata.add_test(
id: test_id,
file_name: base_output_file_name
)
end
|
#module_name ⇒ Object
63
64
65
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 63
def module_name
"DaVinciUSDrugFormulary#{group_metadata.reformatted_version.upcase}"
end
|
#needs_id? ⇒ Boolean
101
102
103
104
105
106
107
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 101
def needs_id?
search_metadata[:names].include?('_id') && resource_type == 'Location'
end
|
#optional? ⇒ Boolean
133
134
135
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 133
def optional?
conformance_expectation != 'SHALL' || !search_metadata[:must_support_or_mandatory]
end
|
#output ⇒ Object
27
28
29
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 27
def output
@output ||= ERB.new(template).result(binding)
end
|
#output_file_directory ⇒ Object
35
36
37
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 35
def output_file_directory
File.join(base_output_dir, profile_identifier)
end
|
#output_file_name ⇒ Object
39
40
41
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 39
def output_file_name
File.join(output_file_directory, base_output_file_name)
end
|
#path_for_value(path) ⇒ Object
117
118
119
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 117
def path_for_value(path)
path == 'class' ? 'local_class' : path
end
|
#post_search_description ⇒ Object
244
245
246
247
248
249
250
251
252
253
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 244
def post_search_description
return '' unless test_post_search?
<<~POST_SEARCH_DESCRIPTION
Additionally, this test will check that GET and POST search methods
return the same number of results. Search by POST is required by the
FHIR R4 specification, and these tests interpret search by GET as a
requirement of US Core #{group_metadata.version}.
POST_SEARCH_DESCRIPTION
end
|
#profile_identifier ⇒ Object
43
44
45
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 43
def profile_identifier
Naming.snake_case_for_profile(group_metadata)
end
|
#reference_search_description ⇒ Object
224
225
226
227
228
229
230
231
232
233
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 224
def reference_search_description
return '' unless test_reference_variants?
<<~REFERENCE_SEARCH_DESCRIPTION
This test verifies that the server supports searching by reference using
the form `formulary=[id]` as well as `formulary=Formulary/[id]`. The two
different forms are expected to return the same number of results. USDF#{' '}
requires that both forms are supported by responders.
REFERENCE_SEARCH_DESCRIPTION
end
|
#required_comparators ⇒ Object
125
126
127
128
129
130
131
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 125
def required_comparators
@required_comparators ||=
search_param_names.each_with_object({}) do |name, comparators|
required_comparators = required_comparators_for_param(name)
comparators[name] = required_comparators if required_comparators.present?
end
end
|
#required_comparators_for_param(name) ⇒ Object
121
122
123
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 121
def required_comparators_for_param(name)
search_definition(name)[:comparators].select { |_comparator, expectation| expectation == 'SHALL' }
end
|
#required_comparators_string ⇒ Object
167
168
169
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 167
def required_comparators_string
array_of_strings(required_comparators.keys)
end
|
#required_multiple_or_search_params ⇒ Object
156
157
158
159
160
161
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 156
def required_multiple_or_search_params
@required_multiple_or_search_params ||=
search_param_names.select do |name|
search_definition(name)[:multiple_or] == 'SHALL'
end
end
|
#required_multiple_or_search_params_string ⇒ Object
163
164
165
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 163
def required_multiple_or_search_params_string
array_of_strings(required_multiple_or_search_params)
end
|
#resource_type ⇒ Object
67
68
69
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 67
def resource_type
group_metadata.resource
end
|
#saves_delayed_references? ⇒ Boolean
141
142
143
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 141
def saves_delayed_references?
first_search? && group_metadata.delayed_references.present?
end
|
#search_definition(name) ⇒ Object
137
138
139
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 137
def search_definition(name)
group_metadata.search_definitions[name.to_sym]
end
|
#search_identifier ⇒ Object
51
52
53
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 51
def search_identifier
search_metadata[:names].join('_').tr('-', '_')
end
|
#search_param_name_string ⇒ Object
97
98
99
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 97
def search_param_name_string
search_metadata[:names].join(' + ')
end
|
#search_param_names ⇒ Object
109
110
111
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 109
def search_param_names
search_params.map { |param| param[:name] }
end
|
#search_param_names_array ⇒ Object
113
114
115
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 113
def search_param_names_array
array_of_strings(search_param_names)
end
|
#search_params ⇒ Object
75
76
77
78
79
80
81
82
83
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 75
def search_params
@search_params ||=
search_metadata[:names].map do |name|
{
name:,
path: search_definition(name)[:path]
}
end
end
|
#search_properties ⇒ Object
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 186
def search_properties
{}.tap do |properties|
properties[:first_search] = 'true' if first_search?
properties[:fixed_value_search] = 'true' if fixed_value_search?
properties[:resource_type] = "'#{resource_type}'"
properties[:search_param_names] = search_param_names_array
properties[:saves_delayed_references] = 'true' if saves_delayed_references?
properties[:token_search_params] = token_search_params_string if token_search_params.present?
properties[:test_reference_variants] = 'true' if test_reference_variants?
properties[:params_with_comparators] = required_comparators_string if required_comparators.present?
if required_multiple_or_search_params.present?
properties[:multiple_or_search_params] =
required_multiple_or_search_params_string
end
properties[:test_post_search] = 'true' if first_search?
end
end
|
#search_test_properties_string ⇒ Object
208
209
210
211
212
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 208
def search_test_properties_string
search_properties
.map { |key, value| "#{' ' * 10}#{key}: #{value}" }
.join(",\n")
end
|
#search_title ⇒ Object
55
56
57
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 55
def search_title
search_identifier.camelize
end
|
#template ⇒ Object
23
24
25
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 23
def template
@template ||= File.read(File.join(__dir__, 'templates', 'search.rb.erb'))
end
|
#test_id ⇒ Object
47
48
49
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 47
def test_id
"usdf_#{group_metadata.reformatted_version}_#{profile_identifier}_#{search_identifier}_search_test"
end
|
#test_post_search? ⇒ Boolean
182
183
184
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 182
def test_post_search?
first_search?
end
|
#test_reference_variants? ⇒ Boolean
176
177
178
179
180
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 176
def test_reference_variants?
search_param_names.any? do |name|
group_metadata.search_definitions[name.to_sym][:type] == 'Reference'
end
end
|
#token_search_params ⇒ Object
145
146
147
148
149
150
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 145
def token_search_params
@token_search_params ||=
search_param_names.select do |name|
['Identifier', 'CodeableConcept', 'Coding'].include? group_metadata.search_definitions[name.to_sym][:type]
end
end
|
#token_search_params_string ⇒ Object
152
153
154
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 152
def token_search_params_string
array_of_strings(token_search_params)
end
|
#url_version ⇒ Object
204
205
206
|
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 204
def url_version
'STU2'
end
|