Class: DaVinciUSDrugFormularyTestKit::Generator::SearchTestGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb

Direct Known Subclasses

IncludeSearchTestGenerator

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(, , base_output_dir)
  self. = 
  self. = 
  self.base_output_dir = base_output_dir
end

Instance Attribute Details

#base_output_dirObject

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

#group_metadataObject

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
end

#search_metadataObject

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
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(, base_output_dir)
  .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_nameObject



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_nameObject



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()}#{search_title}SearchTest"
end

#conformance_expectationObject



71
72
73
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 71

def conformance_expectation
  [:expectation]
end

#descriptionObject



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

Returns:

  • (Boolean)


85
86
87
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 85

def first_search?
  .searches.first == 
end

#first_search_descriptionObject



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

Returns:

  • (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? && ([:names] == ['status'] || [:names] == ['code'])
end

#fixed_value_search_param_nameObject



93
94
95
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 93

def fixed_value_search_param_name
  ([:names] - [:patient]).first
end

#generateObject



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)

  .add_test(
    id: test_id,
    file_name: base_output_file_name
  )
end

#module_nameObject



63
64
65
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 63

def module_name
  "DaVinciUSDrugFormulary#{.reformatted_version.upcase}"
end

#needs_id?Boolean

Returns:

  • (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?
  # resource_type == 'Location'
  [:names].include?('_id') && resource_type == 'Location'

  # search_metadata[:names].include?('patient') ||
  #   (resource_type == 'Patient' && search_metadata[:names].include?('_id'))
end

#optional?Boolean

Returns:

  • (Boolean)


133
134
135
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 133

def optional?
  conformance_expectation != 'SHALL' || ![:must_support_or_mandatory]
end

#outputObject



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_directoryObject



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_nameObject



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_descriptionObject



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 #{.version}.
  POST_SEARCH_DESCRIPTION
end

#profile_identifierObject



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()
end

#reference_search_descriptionObject



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_comparatorsObject



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_stringObject



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_paramsObject



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_stringObject



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_typeObject



67
68
69
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 67

def resource_type
  .resource
end

#saves_delayed_references?Boolean

Returns:

  • (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? && .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)
  .search_definitions[name.to_sym]
end

#search_identifierObject



51
52
53
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 51

def search_identifier
  [:names].join('_').tr('-', '_')
end

#search_param_name_stringObject



97
98
99
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 97

def search_param_name_string
  [:names].join(' + ')
end

#search_param_namesObject



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_arrayObject



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_paramsObject



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 ||=
    [:names].map do |name|
      {
        name:,
        path: search_definition(name)[:path]
      }
    end
end

#search_propertiesObject



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_stringObject



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_titleObject



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

#templateObject



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_idObject



47
48
49
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 47

def test_id
  "usdf_#{.reformatted_version}_#{profile_identifier}_#{search_identifier}_search_test"
end

#test_post_search?Boolean

Returns:

  • (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

Returns:

  • (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|
    .search_definitions[name.to_sym][:type] == 'Reference'
  end
end

#token_search_paramsObject



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? .search_definitions[name.to_sym][:type]
    end
end

#token_search_params_stringObject



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_versionObject



204
205
206
# File 'lib/davinci_us_drug_formulary_test_kit/generator/search_test_generator.rb', line 204

def url_version
  'STU2'
end